Shiro身份认证和权限管理(授权)

69 篇文章 1 订阅
8 篇文章 0 订阅

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、全局异常捕获 相应一个异常的提示信息 例如:相应“没有访问权限”
一般情况下, 不是单个处理 ,会配合着根据需求来选择异常处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值