Shiro没有Spring Security做的功能强大。
shiro四大组件:Authentication认证,Authorization授权,Session Manager会话管理,Cryptography密码学.
shiro与系统交互过程:1、应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager;2、我们需要给Shiro的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断。
从以上也可以看出,Shiro不提供维护用户/权限,而是通过Realm让开发人员自己注入。
shiro单纯用MD5加密不安全,需要加盐加密。
环境配置
1.添加依赖
2.配置web.xml(在shiro官网查找
3.在Controller层创建自定义realm类:AuthRealm,继承AuthorizingRealm
4.在Controller层配置applicationContext-shiro.xml, Spring整合shiro(shiro官网查找
anon匿名访问,指定放行资源
authc认证访问资源
perms授权访问资源
使用shiro完成登录功能:
Controller中的认证过程
//1.获取subject
Subject subject = SecurityUtils.getSubject();
//2.构造用户名和密码
UsernamePasswordToken upToken = new UsernamePasswordToken(user,password);
//3.借助subject完成用户登录
subject.login(upToken);//login进行身份认证
//4.通过shiro获取用户对象,保存到session中(realm认证方法构造器第一个参数就是数据库的用户信息)
User user = (User)subject.getPrincipal(); //获取安全数据(用户对象)
Realm中的认证过程
//1.获取到用户界面输入的用户名和密码
UsernamePasswordToken upToken = (UsernamePasswordToken) authenticationToken;
//2.根据upToken获得用户名
//3.根据用户名查找用户信息
//4.用SimpleAuthenticationInfo封装用户信息,第一个参数:安全数据(user对象)第二个参数:密码(数据库密码)第三个参数:当前调用realm域的名称(类名即可
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getPassword(),this.getName());
使用shiro授权(权限判断
realm中后授权功能
//1.根据认证用户获取当前登录的用户对象
User user = (User) principalCollection.getPrimaryPrincipal();
//2.根据用户id获得权限
//3.使用set集合遍历权限
//4.用SimpleAuthorizationInfo封装用户信息
硬编码实现授权
在Controller中添加
Subject subject = SecurityUtils.getSubject();
subject.cheakPermission("权限名称");//权限校验
xml中实现授权
在applicationContext-shiro.xml中添加
perms的位置必须在authc上。
/访问资源=perms["权限名称"]
注解实现授权
- 在applicationContext-shiro.xml中开启shiro注解支持
- 开启Aop自动代理(已经完成)
- 在controller中使用@RequiresPermissions(“”)注解