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(缓存)。

  • 相关阅读:
    Spring MVC Ajax 嵌套表单数据的提交
    Spring MVC 过滤静态资源访问
    Spring MVC 页面跳转时传递参数
    IDEA Maven 三层架构 2、运行 springMVC
    IDEA Maven 三层架构 1、基本的Archetype 搭建
    EasyUI DataGrid 基于 Ajax 自定义取值(loadData)
    Spring MVC Ajax 复杂参数的批量传递
    Mybatis Sql片段的应用
    在 Tomcat 8 部署多端口项目
    自动升级的设计思路与实现
  • 原文地址:https://www.cnblogs.com/yxth/p/8986099.html
Copyright © 2011-2022 走看看