【shiro】(3)---了解Shiro

了解Shiro

一Apache Shiro做用

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

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

          (1)身份验证 - 验证用户身份,一般称为用户“登陆”。数据库

          (2)受权 - 访问控制apache

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

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

安全

 2、shiro架构

 

    (1) Subject

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

    (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

 

3、过滤器

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

相关文章
相关标签/搜索