Shiro学习:如何在Controller中获取用户名/用户信息(用户名密码+token)

  • Post author:
  • Post category:其他




UserRealm登录

Shiro登录后会将用户信息保存在Subject中,假如使用用户名密码登录,你的用户名、密码就会保存在token中。token在认证时候,也就是执行(

doGetAuthenticationInfo

)的时候,可以将token转化为

UsernamePasswordToken

,通过

UsernamePasswordToken

你可以进行认证、并且在Controller中获取这个信息。

我的执行认证的代码如下:

``
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //System.out.println("执行了=》认证:doGetAuthenticationInfo");
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        User user = userService.queryUserByName(usernamePasswordToken.getUsername());
        if (user == null){
            return null;
        }
        //密码认证shiro做,无须手动进行比较
        return new SimpleAuthenticationInfo(user , user.getPassWord() , "UserRealm");
    }



注意Return这里:SimpleAuthenticationInfo有三个参数:

  1. user:在这里放入了,后面的principals可以强行转化为user类。
  2. password:这个是数据库中用户的密码,注意不需要在使用usernamePasswordToken.getPassword()这个函数,完全无须自己调用比较密码,shiro会完成用户密码和前端传入的比较。
  3. “UserRealm”,realmName的初始化,可以空着,但是建议自己填写上,有些情况你会用到了。
 return new SimpleAuthenticationInfo(user , user.getPassWord() , "UserRealm");

说了这么多,怎么在Controller里面获取用户名/User信息呢?代码如下:

User user = (User) SecurityUtils.getSubject().getPrincipal();

前面的return里面把user信息放入,这里就可以取出来了。假如放回参数你都用默认的也就是下面的写法,Principal就是原始的信息,你需要做如下处理:

//返回参数第一个空白
return new SimpleAuthenticationInfo( , user.getPassWord() , "UserRealm");
//你在Controller里面用下面的语句就行了:usernamePasswordToken 立马保存了用户填写的用户名、密码,不建议这么用
  UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;



Token登录

Token登录和上面的不同就在于你需要把token信息按照自己的需求解析出来,用来初始化你自定义的JwtTokenRealm,初始化后,在认证阶段,你把token解码,然后把解码后的的明文信息获取到,我获取的是userName。完成认证后,根据userName获取user信息,然后把user设为return的第一个参数。后面流程就和上面一样了。



总结:

核心思想要知道,你提交的所有信息,都在subject中,而subject可以通过SecurityUtils获取。subject中的principal就可以保存用户登录后的信息了,你在Controller里面获取了Subject,就可以获取所有信息了。



版权声明:本文为weixin_49046411原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。