项目地址:https://gitee.com/kaidilake118/springsecurity-rbac/
认证授权流程
这里需要重写两个重要的过滤器
-
UsernamePasswordAuthenticationFilter
重写该过滤器的认证、成功回调和失败回调的方法。 -
BasicAuthenticationFilter
重写该过滤器的授权方法。
在该方法中我们执行了
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, token, authorities);
而我么在登录方法中执行的是
UsernamePasswordAuthenticationToken upToken = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword());
对于这两个方法的解释
在用户登录过滤器执行了这样的代码
UsernamePasswordAuthenticationToken upToken = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword());
//调用我们写的userDetailService方法进行认证
return this.authenticationManager.authenticate(upToken);
此时构建了UsernamePasswordAuthenticationToken,交由security来认证
注意此时的构造方法是两个参数的,我们查看源码
public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {
super((Collection)null);
this.principal = principal;
this.credentials = credentials;
this.setAuthenticated(false);
}
看this.setAuthenticated(false);代码此时确定了这个认证对象是未认证的。
而到了我们这个权限过滤器中,我们使用了new UsernamePasswordAuthenticationToken(username, null, authorities);
这个构造方法,我们查看源码
public UsernamePasswordAuthenticationToken(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities) {
super(authorities);
this.principal = principal;
this.credentials = credentials;
super.setAuthenticated(true);
}
而此时的这个构造方法super.setAuthenticated(true); 此时的这个对象被赋予了权限,并经过了认证,
此时我们就可以将这个授权过的对象放入SpringSecurity的上下文中。
- 最后我们需要在核心配置类中加入重写的这两个过滤器
详情请参考源码:https://gitee.com/kaidilake118/springsecurity-rbac/