shiro原理的分析,系统权限管理以及运⾏流程分析
⼀、概述
1、shiro是apache的⼀个开源框架,是⼀个权限管理的框架,实现 ⽤户认证、⽤户授权。
2、(1)spring中有spring security (原名Acegi),是⼀个权限框架,它和spring依赖过于紧密,没有shiro使⽤简单。
(2) shiro不依赖于spring,shiro不仅可以实现 web应⽤的权限管理,还可以实现c/s系统,分布式系统权限管理,shiro属于轻量框架,越来越多企业项⽬开始使⽤shiro。
(3)使⽤shiro实现系统的权限管理,有效提⾼开发效率,从⽽降低开发成本
⼆、Shiro架构分析
2、对以上内容解释
subject:主体,可以是⽤户也可以是程序,主体要访问系统,系统需要对主体进⾏认证、授权。
securityManager:安全管理器,主体进⾏认证和授权都是通过securityManager进⾏。
authenticator:认证器,主体进⾏认证最终通过authenticator进⾏的。
authorizer:授权器,主体进⾏授权最终通过authorizer进⾏的。
sessionManager:web应⽤中⼀般是⽤web容器对session进⾏管理,shiro也提供⼀套session管理的⽅式。
SessionDao:  通过SessionDao管理session数据,针对个性化的session数据存储需要使⽤sessionDao。
cache Manager:缓存管理器,主要对session和授权数据进⾏缓存,⽐如将授权数据通过cacheManager进⾏缓存管理,和ehcache整合对缓存数据进⾏管理。
realm:域,领域,相当于数据源,通过realm存取认证、授权相关数据。
注意:在realm中存储授权和认证的逻辑。
cryptography:密码管理,提供了⼀套加密/解密的组件,⽅便开发。⽐如提供常⽤的散列、加/解密等功能。
⽐如 md5散列算法。
三、认证过程
认证执⾏流程
1、通过ini配置⽂件创建securityManager
2、调⽤subject.login⽅法主体提交认证,提交的token
3、securityManager进⾏认证,securityManager最终由ModularRealmAuthenticator进⾏认证。
4、ModularRealmAuthenticator调⽤IniRealm(给realm传⼊token) 去ini配置⽂件中查询⽤户信息
5、IniRealm根据输⼊的token(UsernamePasswordToken)从 shiro.ini查询⽤户信息,根据账号查询⽤户信息(账号和密码)        如果查询到⽤户信息,就给ModularRealmAuthenticator返回⽤户信息(账号和密码)
如果查询不到,就给ModularRealmAuthenticator返回null
6、ModularRealmAuthenticator接收IniRealm返回Authentication认证信息
如果返回的认证信息是null,ModularRealmAuthenticator抛出异常(org.apache.shiro.authc.UnknownAccountException)
如果返回的认证信息不是null(说明inirealm到了⽤户),对IniRealm返回⽤户密码 (在ini⽂件中存在)
和 token中的密码 进⾏对⽐,如果不⼀致抛出异常(org.apache.shiro.authc.IncorrectCredentialsException)
授权流程:
1、对subject进⾏授权,调⽤⽅法isPermitted("permission串")
2、SecurityManager执⾏授权,通过ModularRealmAuthorizer执⾏授权
3、ModularRealmAuthorizer执⾏realm(⾃定义的Realm)从数据库查询权限数据
调⽤realm的授权⽅法:doGetAuthorizationInfo
4、realm从数据库查询权限数据,返回ModularRealmAuthorizer
5、ModularRealmAuthorizer调⽤PermissionResolver进⾏权限串⽐对
6、如果⽐对后,isPermitted中"permission串"在realm查询到权限数据中,说明⽤户访问permission串有权限,否则没有权限,抛出异常。
详细概述Shiro分析介绍
1.简介
常⽤的Java EE安全框架有shiro、spring security。shiro被应⽤⾮常⼴泛,可以集成cas,搭建单点登录系统。spring security则被认为⽐较重,应⽤没有shiro⼴泛。shiro提供⽤户名、密码验证,及密码
的加密存储,会话Session的管理,与web集成,⽀持HTTPS的拦截。
2.Shiro原理简析
shiro原理剖析:
shiro的核⼼是javaservlet规范中的filter,通过配置,使⽤链来拦截请求,如果允许访问,则通过。通常情况下,系统的登录、退出会配置。登录的时候,调⽤subject.login(token),token是⽤户验证信息,这个时候会在Realm中doGetAuthenticationInfo⽅法中进⾏认证。这个时候会把⽤户提交的验证信息与数据库中存储的认证信息进⾏⽐较,⼀致则允许访问,并在浏览器种下此次回话的cookie,在服务器端存储session信息。退出的时候,调⽤subject.logout(),会清除回话信息。
shiro中核⼼概念介绍:
Filter:
1.AnonymousFilter:通过此filter修饰的url,任何⼈都可以进⾏访问,即使没有进⾏权限认证
2.FormAuthenticationFilter:通过此filter修饰的url,会对请求的url进⾏验证,如果没有通过,则会重定向返回到loginurl
3.BasicHttpAuthenticationFilter:通过此filter修饰的url,要求⽤户已经通过认证,如果没有通过,则会要求通过Authorization 信息进⾏认证
4.LogoutFilter:通过此filter修饰的url,⼀旦收到url请求,则会⽴即调⽤subject进⾏退出,并重定向到redirectUrl
5.NoSessionCreationFilter:通过此filter修饰的url,不会创建任何会话
6.PermissionAuthorizationFilter:权限,验证⽤户是否具有相关权限
7.PortFilter:端⼝,不是通过制定端⼝访问url,将⾃动将端⼝重定向到指定端⼝
8.HttpMethodPermissionFilter:rest风格,配置rest的访问⽅式
9.RolesAuthorizationFilter:⾓⾊,未登陆,将跳转到loginurl,未授权,将跳转到unauthorizedUrl
10.SslFilter:HTTPS,需要以HTTPS的⽅式进⾏访问
11.UserFilter:⽤户,需要⽤户已经认证,或已经remember me
Subject:
表⽰当前操作的主体⽤户,是⼀个抽象的概念,Subject可以进⾏登录、退出、权限判断等动作,通常⼀个subject与⼀个线程进⾏关联。
Realm:
表⽰验证的数据源,存储⽤户的安全数据,可以进⾏⽤户名和密码的匹配,及⽤户权限查询。
3.Shiro配置⽅法
.
shiro配置⽅法:
1. <?xml version="1.0" encoding="UTF-8"?>
2. <beans xmlns="/schema/beans" xmlns:xsi="www.w
instance"
3.        xmlns:util="/schema/util"
4.        xsi:schemaLocation="/schema/beans
5.            /schema/beans/spring-beans-4.0.xsd
6.            /schema/util /schema/util/spring-util.xsd
7.            /schema/aop
8.            /schema/aop/spring-aop-4.0.xsd
9.            /schema/context
10.            /schema/context/spring-context-4.0.xsdshiro安全框架
11.            /schema/tx
12.            /schema/tx/spring-tx-4.0.xsd">
13.
14.    <description>Apache Shiro Security Configuration</description>
15.
16.    <!-- Realm实现 -->
17.    <bean id="userRealm" class="ammon.service.shiro.UserRealm">
18.        <property name="cachingEnabled" value="false"/>
19.    </bean>
20.
21.    <!-- 会话ID⽣成器 -->
22.    <bean id="sessionIdGenerator" class="org.apache.is.JavaUuidSessionIdGenerator"/>
23.
24.    <!-- 会话Cookie模板 -->
25.    <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
26.        <constructor-arg value="sid"/>
27.        <property name="domain" value=".ttyongche"/>
28.        <property name="path" value="/"/>
29.        <property name="httpOnly" value="false"/>
30.        <property name="maxAge" value="-1"/>
31.    </bean>
32.
33.    <!-- 会话DAO -->
34.    <bean id="sessionDAO" class="azycake.shiro.RedisSessionDAO">
35.        <property name="sessionIdGenerator" ref="sessionIdGenerator"/>
36.        <property name="redisManager" ref="redisManager"/>
37.    </bean>
38.
39.    <!-- 会话管理器 -->
40.    <bean id="sessionManager" class="org.apache.shiro.DefaultWebSessionManager">

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。