栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Shiro笔记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Shiro笔记

认证


认证流程如下:
1、首先调用Subject.login(token)进行登录,其会自动委托给Security Manager,调用之前必
须通过SecurityUtils. setSecurityManager()设置;
2、SecurityManager负责真正的身份验证逻辑;它会委托给Authenticator进行身份验证;
3、Authenticator才是真正的身份验证者,Shiro API中核心的身份认证入口点,此处可以自
定义插入自己的实现;
4、Authenticator可能会委托给相应的AuthenticationStrategy进行多Realm身份验证,默认
ModularRealmAuthenticator会调用AuthenticationStrategy进行多Realm身份验证;
5、Authenticator 会把相应的token 传入Realm,从Realm 获取身份验证信息,如果没有返
回/抛出异常表示身份验证失败了。此处可以配置多个Realm,将按照相应的顺序及策略进
行访问。

 1. 开发者负责收集用户身份/凭证,并触发login。
 2. 开发者负责实现Realm,用于获取用户认证数据。
 3. shiro负责处理认证逻辑:判断Realm用户数据和用户输入数据是否匹配。

Shiro默认提供的Realm

授权


授权流程如下:
1、首先调用Subject.isPermitted*/hasRole接口,其会委托给SecurityManager,而
SecurityManager接着会委托给Authorizer;
2、Authorizer是真正的授权者,如果我们调用如isPermitted(“user:view”),其首先会通过
PermissionResolver把字符串转换成相应的Permission实例;
3、在进行授权之前,其会调用相应的Realm获取Subject相应的角色/权限用于匹配传入的
角色/权限;
4、Authorizer会判断Realm的角色/权限是否和传入的匹配,如果有多个Realm,会委托给
ModularRealmAuthorizer 进行循环判断,如果匹配如isPermitted/hasRole*会返回true,否
则返回false表示授权失败。

 1. 开发者负责实现资源验证授权数据。存在3种如下图
 2. 运营者负责配置用户授权数据。
 3. 开发者负责实现Realm,用于获取用户授权数据。
 4. shiro负责处理授权逻辑:判断Realm用户授权数据和资源授权数据是否匹配。

Spring集成
  1. shiro-Filter

    Shiro的ProxiedFilterChain执行流程:1、先执行Shiro自己的Filter链;2、再执行Servlet容器的Filter链(即原始的Filter)。Filter链是随url变化的。
    构造DefaultFilterChainManager:基于filters和filterChainDefinitions生成:每个url的Filter链,每个Filter匹配url集合。
    	不直接将FilterChainManager对象暴露给AbstractShiroFilter的实现者,在这里就是SpringShiroFilter。
    AbstractShiroFilter的doFilterInternal()方法:FilterChainResolver.getChain:当匹配到第一个url规则,则return一个代表这个url规则的FilterChain给web容器执行。
    	PathMatchingFilterChainResolver最重要的作用是:当请求url来的时候,他担任匹配工作。FilterChain是动态生成的。FilterChain通常是一两个Filter组成的。
    Filter链 
    	会将Filter链的Filter的doFilter方法顺序执行一遍。
    
  2. Filter类系->默认拦截器->自定义Filter

    默认Filter
    	基于表单的拦截器authc:前后端完全分离(由前端重定向)的情况通过异常返回表示。
    		没有登录默会跳转到登录页面	loginUrl doGet 
    		登录失败默会跳转到登录页面	loginUrl doPost
    		登录成功	successUrl doGet
    login logout处理的2种方式
    	自调用:/login=anon;/logout=anon。subject.login(token);subject.login(token)
    	交给拦截器:/login = authc;/logout = logout
    
会话管理
Session

SessionManager为所有Subject提供Session的管理,包括创建,删除,失效及验证等。
	Shiro 提供的会话可以用于JavaSE/JavaEE 环境,不依赖于任何底层容器
		Shiro 提供了三个默认实现:
			DefaultSessionManager:DefaultSecurityManager使用的默认实现,用于JavaSE 环境;
			ServletContainerSessionManager:用于Web环境,使用Servlet 容器的会话;
			DefaultWebSessionManager : 用于Web环境, 废弃了Servlet容器的会话管理。
	步骤
		securityManager.sessionManager
		sessionManager.sessionIdCookie
			sessionIdCookie是sessionManager创建会话Cookie的模板。
		sessionManager.sessionDAO:sessionManager创建session后交给sessionDAO,但id由sessionDAO生成,类似数据库自动主键。

会话监听器	

SessionDAO	能够通过该接口来与你想要的任何数据存储进行通信。
	SessionDAO用于会话的CRUD,即DAO(Data Access Object)模式实现。
		EHCache SessionDAO 将会在内存中保存会话,并支持若内存不足时可溢出到磁盘。
			EnterpriseCacheSessionDAO 实现CacheManagerAware 接口自动注入到CacheManager。可自定义SessionDAO不使用CacheManager。
	sessionDAO.sessionIdGenerator

sessionManager源码分析
	public interface Session {会话信息:客户端相关
	SessionManager体系:
		public interface SessionManager {    启动会话+根据会话Key获取会话
			ValidatingSessionManager 用于验资并过期会话接口
				WebSessionManager又提供了如下接口是否使用Servlet容器的会话 

Session Validation & Scheduling无效(过期或停止)的会话能够从会话数据存储中删除。
	Default SessionValidationScheduler
缓存管理
缓存管理器
	Shiro 本身不实现Cache,但是对Cache进行了又抽象,方便更换不同的底层Cache实现。
		public interface Cache {
		public interface CacheManager {
		public interface CacheManagerAware {用于注入CacheManager
关联认证授权与缓存管理器
	DefaultSecurityManager会自动检测相应的对象(如Realm)是否实现了CacheManagerAware并自动注入CacheManager。
		Shiro 提供了CachingRealm,其实现了CacheManagerAware接口,提供了缓存的一些基础实现;
		另外AuthenticatingRealm及AuthorizingRealm分别提供了对AuthenticationInfo和AuthorizationInfo信息的缓存。
		认证缓存默认关闭,授权缓存默认打开。可配置。
?SSL》SSO》OAuth2等等 实践?改造
  1. 预定义角色:管理员、菜单管理员(开发者)
  2. 权限名称直接使用URL资源名称?
  3. 后端做权限控制采用动态:根据配置菜单的URL权限 验证用户权限是否包括该URL
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/932794.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号