springsecurity-shiro获取登录用户详解

解析主流的安全框架校验以及获取登录用户流程。

SpringSecurity

SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。

spring-security获取当前登录用户信息:

(LoginUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal()

解析该代码如何能够获取登录用户。

  • SecurityContextHolder

    SpringSecurity的基本组件,用来存放SecurityContext的对象。默认使用ThreadLocal实现,保证了本线程内所有的方法都可以获得SecurityContext对象。

  • Authentication

    Authentication是springsecurity中保存用户信息的对象,里面包含用户信息,权限信息,登录密码等。可以通过SecurityContextHolder来获取Authentication对象,然后再获取用户信息。

image-20221026100548663

关键请求流程如下:

image-20221026103348864

关键过滤器:

/**
 * token过滤器 验证token有效性
 * 
 * @author ruoyi
 */
@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
{
    @Autowired
    private TokenService tokenService;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException
    {
        LoginUser loginUser = tokenService.getLoginUser(request);
        if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication()))
        {
            tokenService.verifyToken(loginUser);
            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
            authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
            SecurityContextHolder.getContext().setAuthentication(authenticationToken);
        }
        chain.doFilter(request, response);
    }
}

shiro

shiro获取当前登录用户信息:

(LoginUser) SecurityUtils.getSubject().getPrincipal();

包含三大组件:

  • Subject:当前跟软件交互的用户,第三方进程,后台账户等
  • SecurityManager:核心。进行管理内部组件实例,并通过它来提供安全管理的各种服务
  • Realms:Shiro与应用安全数据间的“桥梁”或者“连接器”,会从应用配置的Realm中查找用户及其权限信息。

image-20221026105716318

校验思路与springsecurity类似,同样也是使用过滤器进行用户校验从而获取实际请求的用户信息。

@Slf4j
public class MyShiroRealm extends AuthorizingRealm {
    
    /**
     * 授权
     *
     * @param principals
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        if (principals == null) {
            log.error("MyShiroRealm[] doGetAuthorizationInfo[] principals should not be null");
            throw new AuthorizationException("principals should not be null");
        }
        // ...
    }
    
    /**
     * 认证
     *
     * @param token
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //获取用户的输入的账号.
        String userAccount = (String) token.getPrincipal();
        LoginUser user = userService.queryUserInformation(userAccount);
        if (user == null) {
            throw new UnknownAccountException();
        }
        // ...
    }
    
}

总结

SpringSecurity与Shiro实现原理类似。Shiro更轻量,SpringSecurity与Spring结合度更高也更复杂。

参考资料:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值