先写一个大纲能做什么
1.认证
2.授权
3.会话管理
4.加密
5.缓存
6.与Web集成
配置在最后边
认证
1:如何实现登陆
我们先捋一下登陆历程,我们点击登陆,
1:前端数据发送到登陆控制器
2:在控制器里面创建令牌,然后我们通过shiro的subject的对象调用login方法 传入令牌
3:调用login,之后就交给安全管理器处理,安全管理器从realm拿到数据
4:之后安全管理器 再次委托到 authenticator 传入数据源取来的数据 和token判断账户密码是否相等
这里是两种在认证里面获取传入username的方法
//shiro 会帮我们创建密码是否正确 sql不需要加上密码的条件了
UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken;
对象 principal = (对象)authenticationToken.getPrincipal();
登陆流程实现图
->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
@RequestMapping("/userLogin")
@ResponseBody
public JsonResult login(String username, String password){
//对密码进行加密
Md5Hash md5Hash = new Md5Hash(password,username);
//使用shiro的方式来做登陆功能(目的是 让shiro去改变subject的状态)
Subject subject = SecurityUtils.getSubject();
//把前端传来的用户名和密码封装一个令牌
UsernamePasswordToken token = new UsernamePasswordToken(username,md5Hash.toString());
//执行subject的登陆方法
try {
//因为只有这个地方法 有用户名密码错误,所以没有必要交给统一异常处理的
subject.login(token);
} catch (AuthenticationException e) {
e.printStackTrace();
return new JsonResult(false,"用户名密码错误");
}
return new JsonResult();
}
->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//shiro 会帮我们创建密码是否正确 sql不需要加上密码的条件了
UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken;
//根据用户名查询员工,如果查询到代表用户名是存在的,把密码交给shiro判断 如果查不到就直接 返回空
Employee employee = employeeMapper.selectByUsername(usernamePasswordToken.getUsername());
//参数1:用户主要的信息 一般传入员工对象进入,登录成功后会与subject绑定在一起
//参数2:用户的真正的密码
//参数3:当前数据源的名字,暂时用不上
//注意:第一个参数 参数传入什么 我们在subject就可以拿到什么
if (employee != null) {
return new SimpleAuthenticationInfo(employee, employee.getPassword(), employee.getName());
} else {
return null;
}
}
2:如何实现授权
我们先捋一下权限控制流程
1:我们点击一个功能,会经过shiro的过滤器 会判断是否有权限
2:然后doGetAuthorizationInfo(PrincipalCollection principalCollection) 这个方法
最后返回一个info 就是当前角色拥有的所有所有权限
3:我们只需在这里面获取当前类对象就可以 控制访问权限了
4:对象 uzi = (对象)SecurityUtils.getSubject()