1. Shiro的身份认证流程信息:
后台接受凭证信息(密码)和身份信息(用户名)封装到Subject主体中,调用Subject自己的登陆方法,完成校验。底层校验代码是实现AuthenticatingRealm 类重写doGetAuthentica方法,根据传过来的值来 查询数据库完成用户认证。
2. Shiro的用户授权流程信息:
先认证过以后,根据认证信息查询用户的权限级别,如果有权限,就能够查看所对应的信息和可执行对应 的方法。Controller层的代码实现:调用查询用户权限级别的方法,获得对应的级别,根据级别来设置她的访问权限。底层代码实现:实现AuthorticatingRealm类,分别重写认证和授权的方法。完成授权。
/**
- 授权的realm 包含认证数据和授权数据的获取
*/
public class AuthorRealm extends AuthorizingRealm {
@Autowired private CmfzAdminDao cmfzAdminDao;
@Autowired private CmfzRoleService cmfzRoleService;
/**
- 获取授权数据
- @param principals
- @return 集成SpringBoot 修改认证的集成代码 为最新的Realm
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 1.获取用户名
String username = (String) principals.getPrimaryPrincipal();
// 2.通过用户名查询授权数据
Set permissions = cmfzRoleService.getAllPermissionsByUsername(username);
Set roles = cmfzRoleService.getAllRolesByUsername(username);
// 3.封装info
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.setRoles(roles);
info.setStringPermissions(permissions);
return info;
}
/**
- 获取认证数据
- @param token
- @return
- @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 1.获取用户名
UsernamePasswordToken token1 = (UsernamePasswordToken) token;
String username = token1.getUsername();
// 2.查询数据库
CmfzAdmin cmfzAdmin = cmfzAdminDao.selectOne(new QueryWrapper ().eq(“username”, username));
// 3.封装info
if (cmfzAdmin != null) {
return new SimpleAuthenticationInfo(cmfzAdmin.getUsername(), cmfzAdmin.getPassword(), this.getName());
}
return null;
}
}
集成SpringBoot
配置文件中配置:
@Bean
public AuthorRealm getRealm(){
return new AuthorRealm();
}
其它相关知识点:
Shiro的权限管理会用到最少5张表,分别是:管理员表、角色表(如vip1,vip2)、权限表、用户角色表、角色权限表。 链表查询一般不超过三张表。
上边说的授权方式是代码授权,
其它授权方式还有:
标签授权,
首先引入标签库(<%@taglib prefix=“shiro” uri=“http://shiro.apache.org/tags” %>),通过标签完成授权。代码如下:
<shiro:hasPermission name=“banner:create”>
//该button只有拥有banner:create权限的人可看
</shiro:hasPermission>
<shiro:hasPermission name=“superadmin”>
//该提交按钮只有超级会员才能看
</shiro:hasPermission>
<shiro:hasPermission name=“superadmin”>
//该提交按钮只有会员才能看
</shiro:hasPermission>
注解式授权:
没有对应的权限,不能请求到对应的方法 例如:商品数据 需要有查询商品的权限 如果没有 请求这个地址 会报错
请求注解支持:
/**
- 开启shiro aop注解支持
- 使用代理方式;所以需要开启代码支持;否则@RequiresRoles等注解无法生效
- @param securityManager
- @return
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
对应的方法添加注解:
方法上加@RequiresRoles(value=“superadmin”) //value对应的值是权限 本方法对应的是超级管理员权限
注意:注解式授权 如果没有对应的权限或角色 会抛异常
所以需要异常处理:
1、 页面处理 页面会自动处理 //缺点没办法抛出自己想展示的文字信息 需要手动修改
2、跳转404页面 //缺点 用户不清楚是因为权限问题还是页面真的找不到 易混淆
3、全局异常捕获 相应一个异常的提示信息 例如:相应“没有访问权限”
一般情况下, 不是单个处理 ,会配合着根据需求来选择异常处理。