shiro安全权限框架. 可以做:认证、授权、会话管理、加密、与Web 集成、缓存等
Applciation Code
Subject
shiro SecurityManager UsernamePasswordToken
Realm (相当于securitymanager 的dao)
permitted 被许可 行为
认证 、 角色 、 行为(permitted 可以理解成权限)
用户是否具有某个行为.subject.isPermitted(“权限”);
shiroFilter 配置shiro的过滤器. securityManager 安全管理器 缓存管理器:cacheManager
realm [自己编写Realm 需要实现Realm接口]
sessionModel
生命周期管理器:LifecycleBeanPostProcessor 可以自动调用配置在Spring IOC 容器中的Shiro生命周期方法.
DefaultAdvisorAutoProxyCreator 启用IOC 容器中使用shiro的注解,需要配置该类到容器中。
ShiroFilter 的配置。id必须和web.xml中 文件中的配置的shiroFilter 的name一致。 loginUrl successUrl Unauthorized 没有权限 跳转的路径 哪些页面需要保护,以及哪些页面访问需要权限 /logiin.jsp = anno 可以匿名访问 /** = authc 需要认证之后才能访问。
shiro工作流程:
请求 ----> shiroFilter ----> 服务器
applicationContext.xml中配置哪些页面需要认证、哪些页面匿名可以访问。
认证:
1.获取当前Subject
2.判断是否已登录
3.如果没有认证,则把用户名 、密码封装成UsernamePasswordToken对象
4.调用subject.login方法执行登录,参数AuthenticationToken
5.自定义Realm 的方法,从数据库中获取对应的记录。返回给shiro
5.1 实际上需要继承AuthenticationgRealm类 实现doGetAuthenticationInfo(AuthenticationToken)方法
6.由shiro 完成密码的对比。
密码的比对: 通过 AuthenticatingRealm 的 credentialsMatcher 属性来进行的密码的比对!
MD5盐值加密: 如何把一个字符串加密为 MD5 替换当前 Realm 的 credentialsMatcher 属性. 直接使用 HashedCredentialsMatcher 对象, 并设置加密算法即可.
为什么使用 MD5 盐值加密: 如何做到: 1). 在 doGetAuthenticationInfo 方法返回值创建 SimpleAuthenticationInfo 对象的时候, 需要使用 SimpleAuthenticationInfo(principal, credentials, credentialsSalt, realmName) 构造器 2). 使用 ByteSource.Util.bytes() 来计算盐值. 3). 盐值需要唯一: 一般使用随机字符串或 user id 4). 使用 new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations); 来计算盐值加密后的密码的值.
======================================================================================================================
一、ShiroFilter拦截器的拦截规则: 1.格式:格式是: “url=拦截器[参数],拦截器[参数]”;
anon(anonymous) 拦截器表示匿名访问(即不需要登录即可访问)
authc (authentication)拦截器表示需要身份认证通过后才能访问
比如:/login.jsp = anon /** = authc
2.url 模式使用 Ant 风格模式: – ?:匹配一个字符,如 /admin? 将匹配 /admin1,但不 匹配 /admin 或 /admin/;
– *:匹配零个或多个字符串,如 /admin 将匹配 /admin、
/admin123,但不匹配 /admin/1;
– **:匹配路径中的零个或多个路径,如 /admin/** 将匹
配 /admin/a 或 /admin/a/b
3.URL 权限采取第一次匹配优先的方式,即从头开始 使用第一个匹配的 url 模式对应的拦截器链。 • 如: – /bb/=filter1 – /bb/aa=filter2 – /=filter3 – 如果请求的url是“/bb/aa”,因为按照声明顺序进行匹配,那么将使用 filter1 进行拦截。
shirofilter shiro拦截器链。执行了第一个拦截器,还会走下一个拦截器?
二、shiro认证 applicationcode—–>subject —-> securitymanager —–>realm
1.认证流程: 1. 获取当前的 Subject. 调用 SecurityUtils.getSubject(); 2. 测试当前的用户是否已经被认证. 即是否已经登录. 调用 Subject 的 isAuthenticated() 3. 若没有被认证, 则把用户名和密码封装为 UsernamePasswordToken 对象 1). 创建一个表单页面 2). 把请求提交到 SpringMVC 的 Handler 3). 获取用户名和密码. 4. 执行登录: 调用 Subject 的 login(AuthenticationToken) 方法.UsernamePasswordToken 是AuthenticationToken的实现类。 5. 自定义 Realm 的方法, 从数据库中获取对应的记录, 返回给 Shiro. 1). 实际上需要继承 org.apache.shiro.realm.AuthenticatingRealm 类 2). 实现 doGetAuthenticationInfo(AuthenticationToken) 方法. 6. 由 shiro 完成对密码的比对.
2.密码的比对: 通过 AuthenticatingRealm 的 credentialsMatcher 属性来进行的密码的比对!
3.MD5盐值加密 1. 如何把一个字符串加密为 MD5 2. 替换当前 Realm 的 credentialsMatcher[凭证匹配器] 属性. 直接使用 HashedCredentialsMatcher 对象, 并设置加密算法即可.
credentials 英 [krəˈdenʃlz] 美 [krəˈdenʃlz] n. 资格; 资历; 资格证书; 证明书; 证件;
5.多个realm 验证 1.在配置文件中使用list来配置的多个real,所以有先后执行顺序的。
2.认证策略:AuthenticationStrategy
• FirstSuccessfulStrategy:只要有一个 Realm 验证成功即可,只返回第
一个 Realm 身份验证成功的认证信息,其他的忽略;
• AtLeastOneSuccessfulStrategy:只要有一个Realm验证成功即可,和
FirstSuccessfulStrategy 不同,将返回所有Realm身份验证成功的认证信息;
• AllSuccessfulStrategy:所有Realm验证成功才算成功,且返回所有
Realm身份验证成功的认证信息,如果有一个失败就失败了。
• ModularRealmAuthenticator 默认是 AtLeastOneSuccessfulStrategy策略
6.授权 1. 授权需要继承 AuthorizingRealm 类, 并实现其 doGetAuthorizationInfo 方法 2. AuthorizingRealm 类继承自 AuthenticatingRealm, 但没有实现 AuthenticatingRealm 中的 doGetAuthenticationInfo, 所以认证和授权只需要继承 [AuthorizingRealm]就可以了. 同时实现他的两个抽象方法.
7.shiro 权限注解方式控制权限。
• @RequiresAuthentication:表示当前Subject已经通过login
进行了身份验证;即 Subject. isAuthenticated() 返回 true
• @RequiresUser:表示当前 Subject 已经身份验证或者通过记
住我登录的。 • @RequiresGuest:表示当前Subject没有身份验证或通过记住
我登录过,即是游客身份。 • @RequiresRoles(value={“admin”, “user”}, logical=
Logical.AND):表示当前 Subject 需要角色 admin 和user
• @RequiresPermissions (value={“user:a”, “user:b”},
logical= Logical.OR):表示当前 Subject 需要权限 user:a 或 user:b。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100740.html原文链接:https://javaforall.cn