zoukankan      html  css  js  c++  java
  • 【Shiro】04 ini授权实现

    【授权概念】

    访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。

    在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。

    授权的前提是认证通过。

    (简单说,我只有进系统了我才能知道我可以做什么,系统都进不了怎么授权)

    【关键对象】

    1,主体

    主体,即访问应用的用户,在Shiro中使用Subject代表该用户。

    用户只有授权后才允许访问相应的资源。

    2,资源

    在应用中用户可以访问的任何东西,

    比如访问JSP 页面、查看/编辑某些数据、访问某个业务方法、打印文本等等都是资源。

    用户只要授权后才能访问。

    3,权限

    安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的权力。

    即权限表示在应用中用户能不能访问某个资源,

    如:访问用户列表页面查看/新增/修改/删除用户数据(即很多时候都是CRUD(增查改删)式权限控制)打印文档等等。。。

    4,角色

    角色代表了操作集合,可以理解为权限的集合,

    一般情况下我们会赋予用户角色而不是权限,即这样用户可以拥有一组权限,赋予权限时比较方便。

    典型的如:项目经理、技术总监、CTO、开发工程师等都是角色,不同的角色拥有一组不同的权限。

    【授权流程】

    【相关方法】

    1 subject.hasRole(""); 
    判断是否有角色
    
    2 subject.hashRoles(List);
    分别判断用户是否具有List中每个内容
    
    3 subject.hasAllRoles(Collection);
    返回boolean,要求参数中所有角色用户都需要具有.
    
    4 subject.isPermitted("");
    判断是否具有权限.

    【shiro.ini配置】

    #配置用户
    [users]
    admin=123456,role1
    user01=123456,role2
    user02=123456,role3
    user03=123456,role2,role3
    
    #声明角色
    [roles]
    role1=user:query,user:add,user:update,user:delete,user:export
    role2=user:query,user:add
    role3=user:query,user:export

    测试类编写:

        // 日志输出工具
        private static final transient Logger log = LoggerFactory.getLogger(AuthenticationTest.class);
    
        @SuppressWarnings("deprecation")
        public static void main(String[] args) {
            String username = "admin";
            String password = "123456";
            log.info("My First Apache Shiro Application");
    
            DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
            defaultSecurityManager.setRealm(new IniRealm("classpath:shiro.ini"));
            SecurityUtils.setSecurityManager(defaultSecurityManager);
    
            Subject subject = SecurityUtils.getSubject();
    
            try {
                subject.login(new UsernamePasswordToken(username, password));
                log.info("登陆成功");
            } catch (AuthenticationException authenticationException) {
                authenticationException.printStackTrace();
                log.error("用户名称或者密码不符合");
            }
    
            // 是否认证通过
            boolean authenticated = subject.isAuthenticated();
            log.info("是否认证通过:"+authenticated);
    
            // 角色验证
            boolean hasRole1 = subject.hasRole("role1");
            log.info("是否有role1的角色:"+hasRole1);
    
            //分别判断集合里面的角色 返回数组
            List<String> roleIdentifiers= Arrays.asList("role1","role2","role3");
            boolean[] hasRoles = subject.hasRoles(roleIdentifiers);
            for (boolean hasRole : hasRoles) {
                log.info(String.valueOf(hasRole));
            }
    
            //判断当前用户是否有roleIdentifiers集合里面的所有角色
            boolean hasAllRoles = subject.hasAllRoles(roleIdentifiers);
            log.info(String.valueOf(hasAllRoles));
    
            // ----------------------------------------------------------
    
            //权限判断
            boolean permitted = subject.isPermitted("user:query");
            log.info("判断当前用户是否有user:query的权限  "+permitted);
    
            boolean[] permitted2 = subject.isPermitted("user:query","user:add","user:export");
            for (boolean b : permitted2) {
                log.info(String.valueOf(b));
            }
    
            boolean permittedAll = subject.isPermittedAll("user:query","user:add","user:export");
            log.info(String.valueOf(permittedAll));
    
        }

    测试结果:

    [main] INFO AuthenticationTest - My First Apache Shiro Application
    [main] INFO org.apache.shiro.session.mgt.AbstractValidatingSessionManager - Enabling session validation scheduler...
    [main] INFO AuthenticationTest - 登陆成功
    [main] INFO AuthenticationTest - 是否认证通过:true
    [main] INFO AuthenticationTest - 是否有role1的角色:true
    [main] INFO AuthenticationTest - true
    [main] INFO AuthenticationTest - false
    [main] INFO AuthenticationTest - false
    [main] INFO AuthenticationTest - false
    [main] INFO AuthenticationTest - 判断当前用户是否有user:query的权限  true
    [main] INFO AuthenticationTest - true
    [main] INFO AuthenticationTest - true
    [main] INFO AuthenticationTest - true
    [main] INFO AuthenticationTest - true
    
    Process finished with exit code 0
  • 相关阅读:
    docker save——保存镜像到本地
    Python数据结构学习笔记(三)
    Python数据结构学习笔记(二)
    python优良代码例子(一)
    NFS挂载失败,报No route to host
    python数据结构学习笔记(一)
    Centos7一键安装jdk1.8 shell脚本
    蓝海卓越计费管理系统任意文件读取
    ubuntu设置自定义脚本开机自启动
    Navicat Premium15 注册激活数据库管理工具
  • 原文地址:https://www.cnblogs.com/mindzone/p/13415878.html
Copyright © 2011-2022 走看看