zoukankan      html  css  js  c++  java
  • 【shiro】(3)---了解Shiro

    了解Shiro

    一Apache Shiro作用

         Apache Shiro是一个功能强大且易于使用的Java安全框架,可执行身份验证授权加密会话管理,令行应用程序。

        Shiro提供了应用程序安全API来执行以下几个方面(我喜欢称这些为应用程序安全的四个基石):

              (1)身份验证 - 验证用户身份,通常称为用户“登录”。

              (2)授权 - 访问控制

              (3)加密 - 保护或隐藏窥探数据

              (4)会话管理 - 即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;

     二、shiro架构

        (1) Subject

    Subject:主体,用来与用户交互的对象。比如认证用户信息, subject.login(用户信息)。再比如,判断用户是否有相关的角色 subject.hasRole("小学生");
    Subject实例都绑定到(并且 需要)SecurityManager。当你与Subject进行交互时,这些交互转化为与SecurityManager的交互。

        (2) SecurityManager

    SecurityManager即安全管理器,对全部的subject进行安全管理,它是shiro的核心,负责对所有的subject进行安全管理。通过SecurityManager可以完成subject的认证、授权等,实质上SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等

        (3) Authenticator

    Authenticator即认证器,对用户身份进行认证,Authenticator是一个接口,shiro提供ModularRealmAuthenticator实现类,通过ModularRealmAuthenticator基本上可以满足大多数需求,也可以自定义认证器。

        (4)  Authorizer

    Authorizer即授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。

        (5)  Realm

    Realm即领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据,比如:如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。
    注意:不要把realm理解成只是从数据源取数据,在realm中还有认证授权校验的相关的代码。

         (6)   SessionManager

    sessionManager即会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。

         (7)   SessionDAO

    SessionDAO即会话dao,是对session会话操作的一套接口,比如要将session存储到数据库,可以通过jdbc将会话存储到数据库。

         (8)   CacheManager

    CacheManager即缓存管理,将用户权限数据存储在缓存,这样可以提高性能。

        (9)   Cryptography

    Cryptography即密码管理,shiro提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。

    代码示例

    public class MyFirstTest {  
        @Test  
        public void test1() {  
            //加载配置文件,并获取工厂,这个SecurityManager小心与java.lang包下的SecurityManager冲突  
            Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro_1.ini");  
            //获取安全管理者实例  
            org.apache.shiro.mgt.SecurityManager sm = factory.getInstance();  
            //将安全管理者放入全局对象  
            SecurityUtils.setSecurityManager(sm);  
            //全局对象通过安全管理者生成Subject对象  
            Subject subject = SecurityUtils.getSubject();  
            //封装用户的数据  
            UsernamePasswordToken token = new UsernamePasswordToken("jay", "123");  
            //将用户的数据token 最终传递到Realm中进行对比  
            subject.login(token);  
            //判断本帐号是否已经被认证  
            Assert.assertEquals(true, subject.isAuthenticated());  
        }  
    } 

       shiro_1.ini配置文件内容如下,它就是数据源Realm。以后的章节数据源Realm将是JdbcRealm,数据将会被存放到数据库中

    [users]  
    jay=123

    三、过滤器

    当 Shiro 被运用到 web 项目时,Shiro 会自动创建一些默认的过滤器对客户端请求进行过滤。以下是 Shiro 提供的过滤器:

    过滤器简称

    对应的 Java 类

    anon org.apache.shiro.web.filter.authc.AnonymousFilter
    authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter
    authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
    perms org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
    port org.apache.shiro.web.filter.authz.PortFilter
    rest org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
    roles org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
    ssl org.apache.shiro.web.filter.authz.SslFilter
    user org.apache.shiro.web.filter.authc.UserFilter
    logout org.apache.shiro.web.filter.authc.LogoutFilter
    noSessionCreation org.apache.shiro.web.filter.session.NoSessionCreationFilter

     解释:

    /admins/**=anon               # 表示该 uri 可以匿名访问
    /admins/**=auth               # 表示该 uri 需要认证才能访问
    /admins/**=authcBasic         # 表示该 uri 需要 httpBasic 认证
    /admins/**=perms[user:add:*]  # 表示该 uri 需要认证用户拥有 user:add:* 权限才能访问
    /admins/**=port[8081]         # 表示该 uri 需要使用 8081 端口
    /admins/**=rest[user]         # 相当于 /admins/**=perms[user:method],其中,method 表示  get、post、delete 等
    /admins/**=roles[admin]       # 表示该 uri 需要认证用户拥有 admin 角色才能访问
    /admins/**=ssl                # 表示该 uri 需要使用 https 协议
    /admins/**=user               # 表示该 uri 需要认证或通过记住我认证才能访问
    /logout=logout                # 表示注销,可以当作固定配置

    注意:

    anon,authcBasic,auchc,user 是认证过滤器。

    perms,roles,ssl,rest,port 是授权过滤器。

    想太多,做太少,中间的落差就是烦恼。想没有烦恼,要么别想,要么多做。少校【4】

  • 相关阅读:
    ACM2023
    Archlinux系统运维
    Apache2配置腾讯云SSL证书
    奇异值分解SVD
    剑指offer-不用加减乘除做加法
    负载均衡与缓存
    leetcode简单题6
    python 函数
    Mac-常用命令与快捷键
    GOM通区插件-支持GOM绝对路径-读取配置项-分割字符等功能。不定期更新
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/9152818.html
Copyright © 2011-2022 走看看