【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】

 

posted on 2018-06-07 21:15  雨点的名字  阅读(784)  评论(2编辑  收藏  举报