根据Shiro的设计思路,用户与角色之前的关系为多对多,
角色与权限之间的关系也是多对多。
在数据库中需要因此建立5张表,
分别是
用户表(存储用户名,密码,盐等)、
角色表(角色名称,相关描述等)、
权限表(权限名称,相关描述等)、
用户-角色对应中间表(以用户ID和角色ID作为联合主键)、
角色-权限对应中间表(以角色ID和权限ID作为联合主键)。
总之结论:
Shiro需要根据用户名和密码首先判断登录的用户是否合法,
然后再对合法用户授权。而这个过程就是Realm的实现过程。
授权只是查找数据源中权限并给当前用户
授权与对应资源需要定义的一个权限才能使用
Realm的作用:
1.根据传入用户principle(身份)查询数据源得到对应的用户信息封装交给subject
2.为查询用户的role和permisson 并封装好传给subject
subject得到信息后可以进行认证,判断是否具有某项权限等操作
Realm 是一个能够访问应用程序特定的安全数据(如用户、角色及权限)的组件。
Realm 将应用程序特定的数据转换成一种 Shiro 能够理解的格式
Realm 通常和数据源是一对一的对应关系
Shiro不会去维护用户、维护权限;
这些需要我们自己去设计/提供;然后通过相应的接口注入给Shiro即可
权限是名词,对应着权限表:对某个资源的某种操作!!!
只有在具体应用(资源、url)中标注了该权限名词,权限才起作用
通过注解标注资源的访问权限(该资源需要具有什么权限才能访问)
Shiro共有5个注解,接下来我们就详细说说吧
shiro 提供的注解,提供方法安全验证(方法级别)
1、RequiresAuthentication:
使用该注解标注的类,实例,方法在访问或调用时,当前Subject必须在当前session中已经过认证。
2、RequiresGuest:
使用该注解标注的类,实例,方法在访问或调用时,当前Subject可以是“gust”身份,不需要经过认证或者在原先的session中存在记录。
3、RequiresPermissions:
当前Subject需要拥有某些特定的权限时,才能执行被该注解标注的方法。如果当前Subject不具有这样的权限,则方法不会被执行。
4、RequiresRoles:
当前Subject必须拥有所有指定的角色时,才能访问被该注解标注的方法。如果当天Subject不同时拥有所有指定角色,则方法不会执行还会抛出AuthorizationException异常。
5、RequiresUser
当前Subject必须是应用的用户,才能访问或调用被该注解标注的类,实例,方法。
Shiro的认证注解处理是有内定的处理顺序的
如果有个多个注解的话,前面的通过了会继续检查后面的,若不通过则直接返回,处理顺序依次为(与实际声明顺序无关)
顺序:4>3>1>5>2
示例:
//属于user或者admin之一;修改logical为OR 即可
@RequiresRoles(value={"user","admin"},logical=Logical.OR)
//符合index:hello或index:world权限要求即可
@RequiresPermissions(value={"index:hello","index:world"},logical=Logical.OR)
shiro注解与过滤器的使用
注解是对某个资源方法进行限制(需要配置注解使用) --细粒度
过滤器是对匹配的url进行限制(需要配置过滤器) --粗粒度
anon,authcBasic,auchc,user是认证过滤器,
perms,roles,ssl,rest,port是授权过滤器
为接口配置过滤器链(访问接口时会有对应的过滤器处理后进行访问)(失败会抛出异常)
自定义过滤器
权限名词的定义:
第一部分是域(domain), 第二部分是操作(action), 第三部分是实例(instance)
eg:
role1=user:update:1
表达的是,角色1 拥有实例1的更新权限
对user中的实例1具有update的权限
1.通过注解和过滤器可以配置资源的访问要达到的要求
2.通过Realm可以使subject获得用户的相关role和permission
用户具备某种权限 VS 资源URL需要某种权限才能访问
java 过滤器
Filter接口
用户认证登录成功,会在session中存储是否认证通过的信息!!!!!!!!!
org.apache.shiro.subject.support.DefaultSubjectContext_AUTHENTICATED_SESSION_KEY
登录会默认创建session,也可以自定义session管理器管理session
web环境默认使用web环境的session,se环境默认default session
shiro
用户 操作资源 是否有权限(资源指Controller层接口)
1.用户权限封装
2.资源所需权限定义
3.过滤器匹配
service对象和数据库等是否可作为资源设定权限??(不可!!)