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有三个参数:
- user:在这里放入了,后面的principals可以强行转化为user类。
- password:这个是数据库中用户的密码,注意不需要在使用usernamePasswordToken.getPassword()这个函数,完全无须自己调用比较密码,shiro会完成用户密码和前端传入的比较。
- “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,就可以获取所有信息了。