zoukankan      html  css  js  c++  java
  • shiro的 认证 与 授权

    1,什么是shiro

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

    shiro将安全认证相关的功能抽取出来组成一个框架,使用shiro就可以非常快速的完成认证、授权等功能的开发,降低系统成本。shiro使用广泛,shiro可以运行在web应用,非web应用,集群分布式应用中越来越多的用户开始使用shiro。 java领域中spring security(原名Acegi)也是一个开源的权限管理框架,但是spring security依赖spring运行,而shiro就相对独立,最主要是因为shiro使用简单、灵活,所以现在越来越多的用户选择shiro。

    2、shiro的认证

     (1)认证流程

    (2)程序实现

      1:、加入所需jat包

      2、加入log4j日志文件

      3、编写shiro.ini 

    [users]
    zhang=123
    lisi=123

      4、认证代码

    @Test
        public void testLoginLogout() {
    
            // 构建SecurityManager工厂,IniSecurityManagerFactory可以从ini文件中初始化SecurityManager环境
            Factory<SecurityManager> factory = new IniSecurityManagerFactory(
                    "classpath:shiro.ini");
    
            // 通过工厂创建SecurityManager
            SecurityManager securityManager = factory.getInstance();
            
            // 将securityManager设置到运行环境中
            SecurityUtils.setSecurityManager(securityManager);
    
            // 创建一个Subject实例,该实例认证要使用上边创建的securityManager进行
            Subject subject = SecurityUtils.getSubject();
    
            // 创建token令牌,记录用户认证的身份和凭证即账号和密码 
            UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
    
            try {
                // 用户登陆
                subject.login(token);
            } catch (AuthenticationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            // 用户认证状态
    
            Boolean isAuthenticated = subject.isAuthenticated();
    
            System.out.println("用户认证状态:" + isAuthenticated);
    
            // 用户退出
    
            subject.logout();
    
            isAuthenticated = subject.isAuthenticated();
    
            System.out.println("用户认证状态:" + isAuthenticated);
    
        }

    (3)认证执行流程

    1、  创建token令牌,token中有用户提交的认证信息即账号和密码

    2、  执行subject.login(token),最终由securityManager通过Authenticator进行认证

    3、  Authenticator的实现ModularRealmAuthenticator调用realm从ini配置文件取用户真实的账号和密码,这里使用的是IniRealm(shiro自带)

    4、  IniRealm先根据token中的账号去ini中找该账号,如果找不到则给ModularRealmAuthenticator返回null,如果找到则匹配密码,匹配密码成功则认证通过。

    3、shiro的授权

    (1)执行流程

    (2)授权方式

    Shiro 支持三种方式的授权:

    1、 编程式:通过写if/else 授权代码块完成:

    Subject subject = SecurityUtils.getSubject();

    if(subject.hasRole(“admin”)) {

    //有权限

    } else {

    //无权限

    }

    /2、 注解式:通过在执行的Java方法上放置相应的注解完成:

    @RequiresRoles("admin")

    public void hello() {

    //有权限

    }

    /3、 JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:

    <shiro:hasRole name="admin">

    <!— 有权限—>

    </shiro:hasRole>

    (3)授权测试

    1、shiro.ini

    [users]
    #用户zhang的密码是123,此用户具有role1和role2两个角色
    zhang=123,role1,role2
    wang=123,role2
    
    [roles]
    #角色role1对资源user拥有create、update权限
    role1=user:create,user:update
    #角色role2对资源user拥有create、delete权限
    role2=user:create,user:delete
    #角色role3对资源user拥有create权限
    role3=user:create

    2、测试代码

    @Test
        public void testPermission() {
    
            // 从ini文件中创建SecurityManager工厂
            Factory<SecurityManager> factory = new IniSecurityManagerFactory(
                    "classpath:shiro-permission.ini");
    
            // 创建SecurityManager
            SecurityManager securityManager = factory.getInstance();
    
            // 将securityManager设置到运行环境
            SecurityUtils.setSecurityManager(securityManager);
    
            // 创建主体对象
            Subject subject = SecurityUtils.getSubject();
    
            // 对主体对象进行认证
            // 用户登陆
            // 设置用户认证的身份(principals)和凭证(credentials)
            UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
            try {
                subject.login(token);
            } catch (AuthenticationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            // 用户认证状态
            Boolean isAuthenticated = subject.isAuthenticated();
    
            System.out.println("用户认证状态:" + isAuthenticated);
    
            // 用户授权检测 基于角色授权
            // 是否有某一个角色
            System.out.println("用户是否拥有一个角色:" + subject.hasRole("role1"));
            // 是否有多个角色
            System.out.println("用户是否拥有多个角色:" + subject.hasAllRoles(Arrays.asList("role1", "role2")));
            
    //        subject.checkRole("role1");
    //        subject.checkRoles(Arrays.asList("role1", "role2"));
    
            // 授权检测,失败则抛出异常
            // subject.checkRole("role22");
    
            // 基于资源授权
            System.out.println("是否拥有某一个权限:" + subject.isPermitted("user:delete"));
            System.out.println("是否拥有多个权限:" + subject.isPermittedAll("user:create:1",    "user:delete"));
            
            //检查权限
            subject.checkPermission("sys:user:delete");
            subject.checkPermissions("user:create:1","user:delete");
            
    
        }

    3、

  • 相关阅读:
    2014第2周四部署环境&买火车票
    2014第2周三Web安全学习
    2014第2周二
    2014第2周一
    2013第一周日小结
    2013第1周六意外加班到很晚
    2014第一周五开发问题记URL传参乱码等
    XML文档形式&JAVA抽象类和接口的区别&拦截器过滤器区别
    通过WriteProcessMemory改写进程的内存
    【java】Windows7 下设置环境变量
  • 原文地址:https://www.cnblogs.com/durui/p/9319131.html
Copyright © 2011-2022 走看看