Spring security的认证和授权
admin
2023-02-14 06:40:05
0

Spring security可以进行认证和授权,认证和授权需要针对每一个请求,所以这个功能,可以用过滤器来实现,spring security正是通过一系列过滤器来实现认证和授权功能的。

我们来看看其中几个比较重要的过滤器,类和接口。

1.1    UserDetails

public interface UserDetails extends Serializable {
Collectionextends GrantedAuthority> getAuthorities();
String getPassword();
String getUsername();
boolean isAccountNonExpired();
boolean isAccountNonLocked();
boolean isCredentialsNonExpired();
boolean isEnabled();
}

用来记录用户的信息,包括用户名,权限等信息。

1.2  UserDetailsService

UserDetailsService接口用于返回用户相关数据返回的是一个UserDetails实例,它有loadUserByUsername()方法,该方法可以根据username查询用户实体,可以实现该接口覆盖该方法,实现自定义获取用户过程。

public interface UserDetailsService {
    UserDetails loadUserByUsername(String var1)
throws UsernameNotFoundException;
}

 

1.3    Authentication

封装用户信息的接口,UsernamePasswordAuthenticationToken是它的实现类,用户登录以后,用户名,密码等信息被封装到了UsernamePasswordAuthenticationToken对象中。

它和UserDetails不同之处在于Authentication记录的是当前登录用户的信息,而UserDetails则是用户信息的封装。

public interface Authentication extends Principal, Serializable {
    Collectionextends GrantedAuthority> getAuthorities();

    Object getCredentials();

    Object getDetails();

    Object getPrincipal();

   
boolean isAuthenticated();

   
void setAuthenticated(boolean var1) throws IllegalArgumentException;
}

 

getAuthorities方法获取权限信息的列表

getCredentials方法获取用户认证时输入的密码

getDetails方法获取访问者的ip地址和sessionid的值

getPrincipal方法获取用户的信息,大部分情况下返回的是UserDetails接口的实现类

 

1.4    AuthenticationManager

是认证相关的核心接口,用来处理认证请求,如果认证成功则返回一个Authentication接口的实例,它的默认实现类是:ProviderManager

 

 

SecurityContext:是安全上下文接口,用来存储认证授权的相关信息,这个接口只有两个方法,Authentication对象的getter、setter。

public interface SecurityContext extends Serializable {

    Authentication getAuthentication();

 

    void setAuthentication(Authentication var1);

}

 

1.5    SecurityContextHolder

保存系统当前的安全上下文,包括当前使用系统的用户的信息。

 

1.6    PasswordEncoder

该接口有很多实现类,它用来在认证的过程中使用matches方法比对密码,具体如何比对密码则取决于PasswordEncoder的实现类。

public interface PasswordEncoder {
    String encode(CharSequence var1);
   
boolean matches(CharSequence var1, String var2);
}

比如不对密码进行加密,采用明文字符串进行比对可以:

@Bean
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}

但是在实际项目中我们往往会对密码进行加密,比较常用的PasswordEncoder实现类有:、

BCryptPasswordEncoder, Pbkdf2PasswordEncoder, SCryptPasswordEncoder

如果使用BcryptPasswordEncoder

则:

@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}

 

认证流程:

1.用户提交用户名密码被UsernamePasswordAuthenticationFilter 过滤器获取到,
封装为Authentication接口的实例,通常情况下是UsernamePasswordAuthenticationToken

2.过滤器将Authentication提交至认证管理器(AuthenticationManager)进行认证,认证成功后返回一个被填充满信息的Authentication实例.

3. SecurityContextHolder保存返回的Authentication实例.

 

 

 

授权流程:

1.拦截请求:已认证的用户请求将会被过滤器:FilterSecurityInterceptor拦截。

2. FilterSecurityInterceptor获取访问权限,该权限就是我们配置的访问规则如。

http
.authorizeRequests()
.antMatchers("/r/r1").hasAuthority("p1")
.antMatchers("/r/r2").hasAuthority("p2")

3. FilterSecurityInterceptor会调用访问决策管理器 AccessDecisionManager 进行授权决策,若决策通过,则允许访问资源,否则将禁止访问

AccessDecisionManager:访问决策管理器,用来控制用户是否有相应的权限。

public interface AccessDecisionManager {
/**
* 通过传递的参数来决定用户是否有访问对应受保护资源的权限
*/
void decide(Authentication authentication , Object object, Collection<ConfigAttribute>
configAttributes ) throws AccessDeniedException, InsufficientAuthenticationException;
//..
}

参数说明:

Authentication:要访问资源的访问者

object:要访问的受保护资源

configAttributes:是受保护资源的访问策略

decide方法就是用来判断访问者是否有访问某资源的权限。

它用投票的方式来决定是否有访问某资源的权限

相关内容

热门资讯

德国总理:美国正在被伊朗羞辱 德国之声4月27日报道,德国总理默茨在访问一所学校时表示,在当前的持续冲突中,伊朗领导层正试图羞辱美...
理响中国|“长”歌以行,风云激... 光阴如梭,东方潮阔。这里是中国的长三角,世界的长三角。无论过去、现在还是未来,这片土地都因时代而生,...
白宫:特朗普及其国安团队开会讨... 新华社华盛顿4月27日电 美国白宫新闻秘书莱维特27日在记者会上证实,总统特朗普及其国家安全团队当天...
人民日报刊文:日本放开杀伤性武... 日本放开杀伤性武器出口推高地缘冲突风险(国际论坛)常思纯《人民日报》(2026年04月28日 第 0...
医疗保障法草案二审:明确生育保... 满足多样化健康保障需求本报记者 彭 波4月27日,医疗保障法草案二审稿提请十四届全国人大常委会第二十...
天津一景区发生自转旋翼机事故1... 澎湃新闻记者 吕新文中国民用航空华北地区管理局4月22日公布《豪客通航“10•1”天津长芦汉盐旅游区...
卡塔尔埃米尔与美国总统特朗普通... 当地时间24日,卡塔尔埃米尔塔米姆与美国总统特朗普通电话,重点就中东地区局势以及伊朗与美国谈判问题交...
男子30年前被扣押2859克黄... 澎湃新闻记者 王鑫家住辽宁省大连市的潘永嘉近日向澎湃新闻反映称,三十年前,他在大连周水子机场被盖州市...
商务部:取消反制欧盟两家金融机... 中华人民共和国商务部令二〇二六年 第1号鉴于欧盟已取消对中国两家金融机构的制裁措施,现公布《关于取消...
过去24小时共有5艘船只通过霍... 总台记者当地时间24日获悉,过去24小时内,共有5艘船只通过霍尔木兹海峡,其中包括一艘伊朗油轮。(总...