学习shiro框架记的一次随笔

学习shiro框架记的一次随笔

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 对象, 并设置加密算法即可.

  1. 为什么使用 MD5 盐值加密:
    1. 如何做到:
      1). 在 doGetAuthenticationInfo 方法返回值创建 SimpleAuthenticationInfo 对象的时候, 需要使用
      SimpleAuthenticationInfo(principal, credentials, credentialsSalt, realmName) 构造器
      2). 使用 ByteSource.Util.bytes() 来计算盐值.
      3). 盐值需要唯一: 一般使用随机字符串或 user id
      4). 使用 new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations); 来计算盐值加密后的密码的值.

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。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100740.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • excel中如何隐藏列和取消隐藏列[通俗易懂]

    excel中如何隐藏列和取消隐藏列[通俗易懂]https://jingyan.baidu.com/article/148a192191dc9a4d71c3b11c.htmlexcel如何隐藏列1先看下原表格是怎么样的。2隐藏列方法一:首

  • 常见端口渗透总结[通俗易懂]

    常见端口渗透总结[通俗易懂]文章目录0x00背景服务默认端口爆破0x01实战测试文件共享服务端口渗透ftp服务NFS服务Samba服务LDAP协议远程连接服务端口渗透SSH服务Telnet服务Windows远程连接VNC服务Pcanywhere服务Web应用服务端口渗透IIS服务Apache/Tomcat/Nginx/Axis2WebLogicJbossWebsphereGlassFishJenkinsResinJettyLotus数据库服务端口渗透MySQL数据库MSSQL数据库Oracle数据库PostgreSQL数据库Mon

  • 775针最好的cpu有哪些_1156针cpu是几代

    775针最好的cpu有哪些_1156针cpu是几代针脚也就是cpu的接口,是cpu和主板的连接件,不同的针脚代表不同cpu的类型,现在775针cpu已经成为Intel桌面CPU的标准接口。今天就为大家简单介绍775针cpu以及它们同系列性能排行最好的一款吧。一、775针的cpu的有哪些?主要有奔腾4、赛扬D,奔腾D8、D9系列,奔腾E2、奔腾E5、E6,酷睿E4、E6、E7、E8,酷睿Q6、Q8、Q9。奔腾4采用LGA775接口的有5和6系列,经…

  • 什么是pisa测试_PISA测试真相:哪些学校代表中国考取第一名

    什么是pisa测试_PISA测试真相:哪些学校代表中国考取第一名原标题:PISA测试真相:哪些学校代表中国考取第一名在北京金融行业工作的王鑫如,去年女儿出生后就开始规划送她去哪里接受教育,留在北京,还是随着一个工作机会去香港,或者全家移民国外?她说,将来女儿读大学很大可能会去国外,但基础教育阶段有没有必要出去?中国的基础教育竞争力到底强不强?大学有各种国际排行榜单,不同国家的中小学质量要如何对比?12月3日公布的第七轮国际学生评估结果(Programmefor…

  • 孤立的SQL用户

    孤立的SQL用户

    2021年11月26日
  • idea最新激活码2021(JetBrains全家桶)

    (idea最新激活码2021)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号