1、shiro权限控制的原理:
(1)基于(拦截器Filter)url粗粒度的控制
在数据库中存放用户、权限、访问
url对应的地址,查询数据库判断
用户当前具有权限,是否包含这个
url,如果包含则允许访问,如果
不包含则提示权限不足;
(2)基于(aop)在方法上添加注解的细粒度控制
可以代理、自定义注解实现,访问目标
对象的方法,在方法上添加权限注解
信息,对目标对象创建代理对象,访问真实
对象先访问代理对象,在代理对象查询数据库
时判断是否具有注解上描述需要的权限,若具有
权限,则允许访问,不具有权限,则拦截访问,
提示权限不足;
2、权限控制相关的数据表
(1)实体:用户 角色 权限
(2)权限:描述权限信息(粗粒度权限控制,可能在权限表描述访问资源的url信息)
(3)角色(role):方便用户进行授权,角色就是权限的集合
(4)menu菜单:为了方便进行动态菜单管理,
为不同的用户定制不同的系统菜单,
不同的用户系统菜单,可以根据用户角色进行管理
多对多 多对多
①用户<————————————>角色<——————————————>权限 一共5张表
多对多
②角色<————————————————>菜单
3、shiro的使用流程:
(1)导入maven坐标
(2)配置web.xml
<!-- shiro security filter -->
<!--Shirofilter-->
<filter>
<filter-name>shiroFilter</filter-name>?
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(3)配置applicationContext-shiro.xml文件
<bean id="shiroFilter"
class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- shiro 的核心安全接口 -->
<property name="securityManager" ref="securityManager" />
<!-- 要求登录时的链接 -->
<property name="loginUrl" value="/login.jsp" />
<!-- 登陆成功后要跳转的连接 -->
<property name="successUrl" value="/index.jsp" />
<!-- 未授权时要跳转的连接 -->
<property name="unauthorizedUrl" value="/unauthorized.jsp" />
<!-- shiro 连接约束配置 -->
<propery name="filterChainDefinitions">
<value>
/login = authc
/logout = logout
/resource/** = anon
</value>
</property>
</bean>
<bean id="securityManager"
class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
</bean>
<bean id="lifecycleBeanPostProcessor"
class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
</bean>
anon 未认证就可以访问
authc 认证后才可以访问
perms 需要特定权限才可以访问
roles 需要特定角色才可以访问
user 需要特定用户才可以访问
port 需要特定端口才可以访问
reset 根据特定的http才可以访问
(4)根据shiro的执行流程:
应用程序--subject--securityManager---realm---安全数据
3、shiro的realm的认证和授权的实现
4、配置注解实现业务层方法级别的权限控制
(1)在applicationContext-shiro.xml文件中配置
<!-- 开启shiro注解模式 -->
<bean
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor" >
<!-- 使用cglb代理 -->
<property name="proxyTargetClass" value="true" />
</bean>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
(2)基于注解的授权实现
@ RequiresAuthentication
@ RequiresGuest
@RequiresPermissions("account:create")
@RequiresRoles
@ RequiresUser
5、shiro权限控制小结:
(1)URL级别粗粒度权限控制
①在web.xml文件的shiroFilter拦截/*
②在spring的applicationContext*.xml文件
中配置同名bean,配置filterChainDefintions拦截
xxx.html*=anno 未登录可以访问
xxx.html*=authc 必须登录才能访问
xxx.html*=perms[权限] 需要特定权限才能访问
xxx.html*=roles[角色] 需要特定角色才能访问
(2)在spring的applicationContext.xml中配置
spring aop才对spring管理bean对象开启shiro注解支持
@RequiresPermissions(权限) 需要特定权限才可以访问
@RequiresRoles(角色) 需要特定角色才可以访问
@requiresAuthentication 需要认证才可以访问
(3)通过shiro自定义标签,实现页面元素显示控制
<shiro:authenticated> 登录后才能访问
<shiro:hasPermission name="abc"> 需要特定权限才能访问
<shiro:hasRole name="abc" > 需要特定角色才可以访问
(4)在程序中通过代码 判断用户是否具有指定权限(不常用,有代码侵入性,不推荐使用)
6、补充:权限表达式 “:”代表子权限
①权限: courier 包含courier:add 、 courier:list 、courier:*
②如果用户具有父权限,则可以操作所有子权限功能
(1)基于(拦截器Filter)url粗粒度的控制
在数据库中存放用户、权限、访问
url对应的地址,查询数据库判断
用户当前具有权限,是否包含这个
url,如果包含则允许访问,如果
不包含则提示权限不足;
(2)基于(aop)在方法上添加注解的细粒度控制
可以代理、自定义注解实现,访问目标
对象的方法,在方法上添加权限注解
信息,对目标对象创建代理对象,访问真实
对象先访问代理对象,在代理对象查询数据库
时判断是否具有注解上描述需要的权限,若具有
权限,则允许访问,不具有权限,则拦截访问,
提示权限不足;
2、权限控制相关的数据表
(1)实体:用户 角色 权限
(2)权限:描述权限信息(粗粒度权限控制,可能在权限表描述访问资源的url信息)
(3)角色(role):方便用户进行授权,角色就是权限的集合
(4)menu菜单:为了方便进行动态菜单管理,
为不同的用户定制不同的系统菜单,
不同的用户系统菜单,可以根据用户角色进行管理
多对多 多对多
①用户<————————————>角色<——————————————>权限 一共5张表
多对多
②角色<————————————————>菜单
3、shiro的使用流程:
(1)导入maven坐标
(2)配置web.xml
<!-- shiro security filter -->
<!--Shirofilter-->
<filter>
<filter-name>shiroFilter</filter-name>?
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(3)配置applicationContext-shiro.xml文件
<bean id="shiroFilter"
class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- shiro 的核心安全接口 -->
<property name="securityManager" ref="securityManager" />
<!-- 要求登录时的链接 -->
<property name="loginUrl" value="/login.jsp" />
<!-- 登陆成功后要跳转的连接 -->
<property name="successUrl" value="/index.jsp" />
<!-- 未授权时要跳转的连接 -->
<property name="unauthorizedUrl" value="/unauthorized.jsp" />
<!-- shiro 连接约束配置 -->
<propery name="filterChainDefinitions">
<value>
/login = authc
/logout = logout
/resource/** = anon
</value>
</property>
</bean>
<bean id="securityManager"
class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
</bean>
<bean id="lifecycleBeanPostProcessor"
class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
</bean>
anon 未认证就可以访问
authc 认证后才可以访问
perms 需要特定权限才可以访问
roles 需要特定角色才可以访问
user 需要特定用户才可以访问
port 需要特定端口才可以访问
reset 根据特定的http才可以访问
(4)根据shiro的执行流程:
应用程序--subject--securityManager---realm---安全数据
3、shiro的realm的认证和授权的实现
4、配置注解实现业务层方法级别的权限控制
(1)在applicationContext-shiro.xml文件中配置
<!-- 开启shiro注解模式 -->
<bean
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor" >
<!-- 使用cglb代理 -->
<property name="proxyTargetClass" value="true" />
</bean>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
(2)基于注解的授权实现
@ RequiresAuthentication
@ RequiresGuest
@RequiresPermissions("account:create")
@RequiresRoles
@ RequiresUser
5、shiro权限控制小结:
(1)URL级别粗粒度权限控制
①在web.xml文件的shiroFilter拦截/*
②在spring的applicationContext*.xml文件
中配置同名bean,配置filterChainDefintions拦截
xxx.html*=anno 未登录可以访问
xxx.html*=authc 必须登录才能访问
xxx.html*=perms[权限] 需要特定权限才能访问
xxx.html*=roles[角色] 需要特定角色才能访问
(2)在spring的applicationContext.xml中配置
spring aop才对spring管理bean对象开启shiro注解支持
@RequiresPermissions(权限) 需要特定权限才可以访问
@RequiresRoles(角色) 需要特定角色才可以访问
@requiresAuthentication 需要认证才可以访问
(3)通过shiro自定义标签,实现页面元素显示控制
<shiro:authenticated> 登录后才能访问
<shiro:hasPermission name="abc"> 需要特定权限才能访问
<shiro:hasRole name="abc" > 需要特定角色才可以访问
(4)在程序中通过代码 判断用户是否具有指定权限(不常用,有代码侵入性,不推荐使用)
6、补充:权限表达式 “:”代表子权限
①权限: courier 包含courier:add 、 courier:list 、courier:*
②如果用户具有父权限,则可以操作所有子权限功能
例如:权限courier:list 包含courier:list:10