springsecurity-shiro获取登录用户详解

Posted Vainycos

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springsecurity-shiro获取登录用户详解相关的知识,希望对你有一定的参考价值。

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

文章目录

SpringSecurity

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

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

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

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

  • SecurityContextHolder

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

  • Authentication

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

关键请求流程如下:

关键过滤器:

/**
 * 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中查找用户及其权限信息。

校验思路与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结合度更高也更复杂。

参考资料:

登录页面总结

首先学习了request对象来获取表单信心,一共有三种方式来获取。

所以我们可以试着做一个登录页面。实现跳转并显示用户名和密码

基于step by step,首先是直接用jsp页面跳转。因为表单可以传递,可以用request对象获取,javabean获取用类的属性获取,usebean 中getProperty获取。也可以用Session获取。

当然还包括,登录成功用服务器跳转方式,也就是请求跳转到登录成功页面,URL不变,且保存信息。但超链接是get方式。(超链接是请求重定向?,不保存信息)。

登录失败请求重定向,response方法。

 

那么,实践来了。

在没学javabean之前,不会封装javabean类。所以逻辑处理都放在jsp的百分号里面处理。

 

学习了javabean之后,就封装类,和逻辑DAO类,便于处理,简化代码。

 

但是此时不能记住用户登录状态,比如十天内自动登录,或记住用户名这种。所以接下来学习cookie来处理这个。

 

使用cookie的具体步骤:

1首先判断表单中的checkbox是否被勾选,用request.getParameter("checkboxname");返回的是一个value的字符串,如果没有设置,则默认勾选的value的值是on,未勾选则是null

2.然后创建Cookie对象来保存cookie的name和value的值对。

这里一个重要问题是为什么要用response对象来添加。好像我前面总结过,因为这是保存到客户端,所以用response,其他原因暂时忘记。

所以Cookies里面应该保存了很多个cookie对象,每个对象中都有名字和值,通过名字来获取value就是我们的目的。

 

以上是关于springsecurity-shiro获取登录用户详解的主要内容,如果未能解决你的问题,请参考以下文章

如何用JS获取当前登录用户名

js怎样获取session值 在登录页面中

怎么用BAT或者powershell获取主机名和登录用户保存到TXT文件中,或者用其他啥方式?

怎样获取当前登录用户的ID

第六节 爬虫用密码登录自动获取cookie

怎样用delphi 获取网页html源代码(网页需登录)