{{π型人才培养计划}}Shiro

shiro

权限管理

1. 什么是权限管理

基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。
权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。

2. 认证
  1. 认证:判断一个用户是否合法。
  2. 认证中抽象出来的对象
    • 主体 :subject,只要进行认证,那就是一个主体。
    • 身份信息 :Principal , 是主体(subject)进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、邮箱地址等,一个主体可以有多个身份,但是必须有一个主身份(Primary Principal)。
    • 凭证信息:credential,只有主体自己知道的安全信息。
3.授权
  1. 授权:授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。

  2. 授权抽象出来的对象

    授权可简单理解为who对what(which)进行How操作:

    • Who,即主体(Subject),主体需要访问系统中的资源。
    • What,即资源(Resource),如系统菜单、页面、按钮、类方法、系统商品信息等。资源包括资源类型和资源实例,比如商品信息为资源类型,类型为t01的商品为资源实例,编号为001的商品信息也属于资源实例。
    • How,权限/许可(Permission),规定了主体对资源的操作许可,权限离开资源没有意义,如用户查询权限、用户添加权限、某个类方法的调用权限、编号为001用户的修改权限等,通过权限可知主体对哪些资源都有哪些操作许可。

    权限分为粗颗粒和细颗粒,粗颗粒权限是指对资源类型的权限,细颗粒权限是对资源实例的权限。

4.模型
  1. .最初的模型:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JsXq27LX-1583219448770)(assets/模型初版.png)]

  2. 经过企业实战,演变成以下模型

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zuQf48GG-1583219448774)(assets/模型成版.png)]

权限控制策略
  1. 基于角色控制

    是以角色为中心进行访问控制

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eF4EP2Qv-1583219448776)(assets/以角色为中心.png)]

    以代码形式表现:

    if(主体.hasRole(“总经理角色id”)){

    ​ 查询工资

    }

    缺点:不方便日后的代码扩展。

  2. 基于资源(权限)

    是以资源为中心进行访问控制。

    代码可以理解为:

    if(主体.hasPermission(“查询工资权限标识”)){

    ​ 查询工资

    }

shiro

  1. 什么是shiro?

    Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架

  2. 为什么要学shiro

    shiro开源,目前在企业中比较实用。应用广泛。不需要依赖于其他框架环境。

  3. shiro的架构

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dAvVqyO7-1583219448778)(assets/shiro的架构图.png)]

shiro的使用
  1. 导入依赖

    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-spring-boot-starter</artifactId>
      <version>1.4.1</version>
    </dependency>
    
  2. 代码

    @Test
        public void contextLoads() {
            //模拟数据源
            Realm realm=new IniRealm("classpath:shiro.ini");
            //安全管理器
            SecurityManager securityManager=new DefaultSecurityManager(realm);
    
            SecurityUtils.setSecurityManager(securityManager);
    
            Subject subject = SecurityUtils.getSubject();
    
            AuthenticationToken token= new UsernamePasswordToken("zhangsan","1111111");
    
            subject.login(token);
            //UnknownAccountException        账户不存在
            //IncorrectCredentialsException  凭证信息异常
            
        }
    
  3. 将配置文件的数据替换成数据库查出的数据

    • 先自定义MyReaml类去继承AuthenticatingRealm
    • 实现doGetAuthenticationInfo方法。
    //自定义Reaml继承AuthenticatingRealm并实现doGetAuthenticationInfo方法
    public class MyRealm extends AuthenticatingRealm {
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
            String principal = (String) authenticationToken.getPrincipal();
            //根据当前身份信息查询数据库有没有这个主体(对象).User user=userDao.getUser(principal);
            if(principal.equals("zhangsan")){
                AuthenticationInfo authenticationInfo=new SimpleAuthenticationInfo("zhangsan","111111",this.getName());
                return authenticationInfo;
            }else {
                return null;
            }
        }
    }
    

    测试:

    @Test
        public void contextLoads() {
            Realm realm=new MyRealm();
            //创建安全管理器
            SecurityManager securityManager=new DefaultSecurityManager(realm);
            //设置安全管理器工具类
            SecurityUtils.setSecurityManager(securityManager);
            //获得主体
            Subject subject = SecurityUtils.getSubject();
            //进行认证
            AuthenticationToken token=new UsernamePasswordToken("zhangsan","1111111");
            subject.login(token);
        }
    

;
//进行认证
AuthenticationToken token=new UsernamePasswordToken(“zhangsan”,“1111111”);
subject.login(token);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值