文章目录
shiro简介
shiro能做什么?
答:shiro可以帮助我们完成认证,授权,加密,会话管理,与web集成,缓存等.
shiro功能模块有哪些?
答:Authentication:身份认证/登录,验证用户是不是拥有相应的身份.
Authorization:验证某个已认证的用户是否拥有某个权限.Session Manager:会话管理.Cryptography:加密.Web Support:web支持.Caching:缓存.Concurrency:多线程应用的并发验证.Testing:提供测试支持.Run As:允许一个用户假装为另一个用户的身份进行访问.Remember Me:记住我,一次登陆后,下次再来不用登录.
一个最简单的shiro应用是怎样运行的?
答:应用代码通过subject来进行认证和授权,而subject又委托给securityManager.我们需要给shiro的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断.
身份验证
如何进行身份验证?
答:在shiro中,用户需要提供principals(身份)和credentials(证明)给shiro.
1.首先调用Subject.login(token)进行登录,其会自动委托给SecurityManager,调用之前必须通过SecurityUtils.setSecurityManager()设置.
2.SecurityManager负责真正的身份验证逻辑,它会委托给Authenticator进行身份验证.
3.Authenticator才是真正的身份验证者,Shiro API中核心的身份认证入口点,此处可以自定义插入自己的实现.
4.Authenticator可能会委托给相应的AuthenticationStrategy进行多Realm身份验证,默认ModularRealmAuthenticator会调用AuthenticationStrategy进行多realm身份验证.
5.Authenticator会把相应的token传入realm,从realm获取身份验证信息
realm的自定义实现
答:realm的接口有三个函数:
String getName():返回一个唯一的realm名字.
boolean support(AuthenticationToken token):判断此realm是否支持此Token.
AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException:根据Token获取认证信息.
将这三个函数重写即可自定义实现.
Authenticator和AuthenticationStrategy的作用
答:Authenticator的职责是验证用户账号,是shiro API中身份验证核心的入口点.SecurityManager继承了Authenticator,另外还有一个ModularRealmAuthenticator实现,验证规则通过AuthenticationStrategy接口指定.
AuthenticationStrategy的接口实现如下:
FirstSuccessfulStrategy:只要有一个realm验证成功,就返回成功的那一个认证信息,后面的realm不验证.
AtLeastOneSuccessfulStrategy:只要有一个realm验证成功,就返回所有realm的认证信息.
AllSuccessfulStrategy:只有所有realm验证成功才返回认证信息.
ModuleRealmAuthenticator默认使用的策略是AtleastOneSuccessfulStrategy.
如何自定义AuthenticationStrategy
要重写如下方法:
//在所有realm验证之前调用
AuthenticationInfo beforeAllAttempts(Collection<? extends Realm>realms,AuthenticationToken token)throws AuthenticationException{}
//在每个realm之前调用
AuthenticationInfo beforeAttempt(Realm realm, AuthenticationToken token,AuthenticationInfo aggregate)throws AuthenticationException{}
//在每个realm之后调用
AuthenticationInfo afterAttempt(Realm realm,AuthenticationToken token,AuthenticationInfo singleRealmInfo,AuthenticationInfo aggregateInfo,Throwable t)throws AuthenticationException{}
//在所有Realm之后调用
AuthenticationInfo afterAllAttempts(AuthenticationToken token,AuthenticationInfo aggregate)throws AuthenticationException{}
授权
什么叫授权?如何实现授权?
授权也叫访问控制,即在应用中控制谁能访问哪些资源.
在授权中需了解的几个关键对象:Subject(主体),Resource(资源),Permission(权限),Role(角色).
shiro支持三种方式的授权:1.编程式授权Subject subject=SecurityUtils.getSubject();
if(subject.hasRole("admin")){
//有权限
}else{
//无权限}
2.注解式授权@RequiresRoles("admin")
public void hello(){//有权限}
3.jsp标签注解<shiro:hasRole name="admin">
<!--有权限-->
</shiro:hasRole>
关于隐式角色的授权方式和显示角色的授权方式
关于隐式角色的授权可在ini配置文件中声明
[users]
用户名=密码,角色1,角色2,...
关于显示角色的授权
[users]
zhang=123,role1,role2
[roles]
role1=user:create,user:update
role2=user:delete
关于permission
字符串通配符权限
规则:“资源标识符:操作:对象实例ID(可省略)”
system:user拥有的权限如下:create,update,delete,view
关于授权的实现流程
- 首先由subject.isPermitted/hasRole接口函数委托给SecurityManager,再由SecurityManager转给Authorizer.
- Authorizer再通过PermissionResolver把字符串转换为相应的Permission实例.
- 在进行授权前,会调用相应的Realm获取subject相应的角色/权限用于匹配传入的角色/权限.
- Authorizer会判断realm的角色/权限是否和传入的匹配,若有多个Realm,会委托给ModularRealmAuthorizer进行循环判断.
Authorizer,PermissionResolver及RolePermissionResolver的关系
Authorizer的职责是进行授权.PermissionResolver用于解析权限字符串到Permission实例,而RolePermissionResolver用于根据角色解析相应的权限集合.
2进制表示权限
1(0001):新增
2(0010):修改
4(0100):删除
8(1000):查看
INI配置
shiro支持哪些依赖注入?
1.public空参数构造方法注入
2.setter注入.