shiro框架的UsernamePasswordToken与对应Realm中的AuthenticationToken的一点比较(转)
2024-08-27 21:31:12
这里以简单的登陆为例子
控制器对应的登陆方法:
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(@RequestParam("username") String username, @RequestParam("password") String password){
// 获取当前的 Subject. 调用 SecurityUtils.getSubject();
Subject currentUser = SecurityUtils.getSubject();
// 测试当前的用户是否已经被认证. 即是否已经登录.
// 调动 Subject 的 isAuthenticated()
if (!currentUser.isAuthenticated()) {
// 把用户名和密码封装为 UsernamePasswordToken 对象
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
// rememberme
token.setRememberMe(true);
try {
System.out.println("UsernamePasswordToken:");
System.out.println("hashCode:" + token.hashCode());
System.out.println("Principal:" + token.getPrincipal());
System.out.println("Credentials:" + String.valueOf((char[]) token.getCredentials()));
System.out.println("host:" + token.getHost());
System.out.println("Username:" + token.getUsername());
System.out.println("Password:" + String.valueOf(token.getPassword()));
// 执行登录.
currentUser.login(token);
}
// ... catch more exceptions here (maybe custom ones specific to your application?
// 所有认证时异常的父类.
catch (AuthenticationException ae) {
//unexpected condition? error?
System.out.println("login failed :" + ae.getMessage());
}
}
return "redirect:/index.jsp";
}
在这里打印了所有的UsernamePasswordToken的属性值
再在对应的Realm中打印一下接收的AuthenticationToken的所有属性值
一个简单的例子:
public class ShiroRealm extends AuthenticatingRealm {
@Resource
private AdminService adminService;
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("AuthenticationToken:");
System.out.println("hashCode:" + authenticationToken.hashCode());
System.out.println("Principal:" + authenticationToken.getPrincipal());
System.out.println("Credentials:" + authenticationToken.getCredentials().toString());
return null;
}
}
打印结果:
注意:
credentials这个属性,在UsernamePasswordToken中其实是个Object,查看源代码,getCredentials()方法返回的就是password
源代码,见图:
故,若要正确得到UsernamePasswordToken的password,可以将credentials转为char[]再String.valof()方法获得String。
最新文章
- CI3.0控制器下面建文件夹 访问一直404 的解决方法
- Arch Linux PDF格式文件无法显示中文
- ubuntu下面mysql,通过载入txt文件初始化数据表
- 【整理】--【字符设备】cdev_init()/cdev_alloc(),cdev_add(),cdev_del()
- 【BZOJ 3083】遥远的国度
- poj2386(简单dfs)
- 应对Memcached缓存失效,导致高并发查询DB的四种思路(l转)
- Leetcode--Add two number
- MongoDB 学习笔记(三)—— 修改器的使用
- iOS中关于KVC与KVO知识点
- Linux下使用dnf包管理器安装异常后导致的clear不可用
- maven打一个可执行的jar包
- iOS7动态调整文字大小
- 关于C#中程序功能实现,对代码选择的思考
- easyui时间框只选择年月
- 初入 vue
- Python科学计算学习之高级数组(二)
- C++指针和字符串
- Java_myBatis_xml代理写法
- scrollview滑动到某区域执行某种方法
热门文章
- sql server代理服务无法启动(SQL Agent):OpenSQLServerInstanceRegKey:GetRegKeyAccessMask failed (reason: 2).
- python学习-16 列表list
- Django 关联查询
- 图像人脸检测+人眼检测 (opencv + c++)
- django中使用redis保存session(转)
- 微信小微商户申请入驻 .NET C#实现微信小微商户进件API
- NodeJs 的Module.export 和 export
- ajax检查用户名重复
- Go Select使用
- python多线程与多进程异步事件框架