zoukankan      html  css  js  c++  java
  • shiro入门

    本篇文章来自慕课网Shiro安全框架入门视频教程,以下内容为作者观看视频后总结内容。

    一、什么是Shiro

    • Apache下的一个强大灵活的开源安全框架
    • 认证、授权、企业会话管理、安全加密
    • 可以帮助快速完成权限管理模块的开发
    二、Shiro与Spring Security比较
    • 前者简单、灵活-----------后者复杂、笨重
    • 前者可以脱离spring------后者不可脱离spring
    • 前者权限控制粒度较粗--后者权限控制力度较细
    三、Shiro架构图
        Shiro通过security Manager管理。
        Authenticator:认证器,管理登入与登出。
        Authorizer:授权器,赋予主体拥有哪些权限
        Session Manager:会话管理器
        Session Dao:提供session操作,包括增删改查
        Cache Manager:缓存管理器
    四、Shiro认证
    1、首先生成一个简单的认证代码,如下。
    public class AuthenticationTest {
    
        SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();
        
        @Before
        public void add(){
            simpleAccountRealm.addAccount("yxf", "123");
        }
        
        @Test
        public void testAuthentication(){
            //1.构建SecurityManager环境
            DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
            defaultSecurityManager.setRealm(simpleAccountRealm);
            
            //2.主体提交认证请求
            SecurityUtils.setSecurityManager(defaultSecurityManager);
            Subject subject = SecurityUtils.getSubject();
            
            UsernamePasswordToken token = new UsernamePasswordToken("yxf", "123");
            subject.login(token);
            
            System.out.println("isAuthenticated:" + subject.isAuthenticated());
            
        }
    }

    在上面代码中可见的认证过程,

      1、创建一个Realm,并将用户名与密码添加进去。

      2、构建SecurityManager环境,将Realm放入安全管理环境中。

      3、接收主体提交来的认证请求(这里我们为了方便测试使用手动创建的token)。

      4、对请求进行认证。

    认证结果:

      1、用户已登录:方法将返回true。

      2、用户未登录:方法将返回false。

      2、用户名不正确:在login方法中,程序将抛出异常org.apache.shiro.authc.UnknownAccountException(未知的用户)。

      3、密码不正确:在login方法中,程序将抛出异常org.apache.shiro.authc.IncorrectCredentialsException(非法凭证)。

      4、用户名密码都不正确:同2.

    五、Shiro授权

    生成一个简单授权代码,如下

    public class AuthenticationTest {
    
        SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();
        
        @Before
        public void add(){
            simpleAccountRealm.addAccount("yxf", "123", "admin", "user");
        }
        
        @Test
        public void testAuthentication(){
            //1.构建SecurityManager环境
            DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
            defaultSecurityManager.setRealm(simpleAccountRealm);
            
            //2.主体提交认证请求
            SecurityUtils.setSecurityManager(defaultSecurityManager);
            Subject subject = SecurityUtils.getSubject();
            
            UsernamePasswordToken token = new UsernamePasswordToken("yxf", "123");
            subject.login(token);
            
            //认证
            System.out.println("isAuthenticated:" + subject.isAuthenticated());
            
            //授权角色
            subject.checkRole("admin");
            subject.checkRole("user");
            subject.checkRoles("admin", "user");
            //授权用户
            subject.checkPermission("select");
            subject.checkPermissions("select","update");
        }
    }

    如上代码中,用户首先经过认证,认证通过,可以进行授权,授权分为角色授权与权限授权。可以一次检查一个角色/权限授权,也可以一次检查多个。如果检查授权不存在,程序将抛出如下异常:

    org.apache.shiro.authz.UnauthorizedException: Subject does not have role [user2](无法授权,找不到“user2”角色)

    org.apache.shiro.authz.UnauthorizedException: Subject does not have permission [select](无法授权,找不到"select"权限)

    六、Realm

    Shiro无论是认证还是授权,都需要从Realm中获取数据。

    Realm接口中有如下三个接口:

    public interface Realm {
    
        String getName();
    
        boolean supports(AuthenticationToken token);
    
        AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException;
    
    }

    Realm的体系结构:

    一般情况下,最常用的Realm实现类为IniRealm,JdbcRealm以及PropertiesRealm。

    IniRealm:

    我们自定义Realm只需继承AuthorizingRealm(授权)抽象接口,因为该接口已经继承了AuthenticatingRealm(认证)和CachingRealm(缓存)。

  • 相关阅读:
    统计MySQL数据库硬盘占用量大小
    zookeeper 集群安装与配置
    On Java 8中文版 英雄召集令
    下划线参数转成驼峰
    在Ubuntu 18.04中安装JDK 8
    GIT和GitHub的使用总结
    Python目录
    selenium代码实例
    Fiddler请求图标含义
    Tensorflow之神经网络
  • 原文地址:https://www.cnblogs.com/yxth/p/8986099.html
Copyright © 2011-2022 走看看