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

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,就可以获取所有信息了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值