一:权限控制两种主要方式
粗粒度 URL 级别权限控制和细粒度方法级别权限控制
1.粗粒度 URL 级别权限控制
可以基于 Filter 实现在数据库中存放 用户、权限、访问 URL 对应关系, 当前用户访问一个 URL 地址,查
询数据库判断用户当前具有权限,是否包含这个 URL,如果包含允许访问,如果不包含权限不足
2.粗粒度 URL 级别权限控制和
可以代理、自定义注解实现, 访问目标对象方法,在方法上添加权限注解信息,对目标对象创建代理对象,
访问真实对象先访问代理对象,在代理对象查询数据库判断是否具有注解上描述需要权限,具有权限 允许访问,
不具有权限,拦截访问,提示权限不足
二:权限控制相关数据表
实体 : 用户、角色、权限(他们之间都是多对多的关系)
用户: 系统登录用户 User
权限: 描述权限信息 (粗粒度权限控制,可能在权限表描述访问资源 URL 信息)
Permission
角色: 方便用户进行授权, 角色就是权限的集合 Role
用户 *---* 角色 *---* 权限 ==> 建立 至少5 张数据表
Menu 菜单, 为了方便进行动态菜单管理 , 为不同用户定制不同系统菜单
不同用户系统菜单,可以根据用户角色 进行管理 角色 * --- * 菜单
三:建立实体类创建对应的数据库表
四:ApacheShiro 框架入门
1.Apache Shiro框架简介和下载导入
官网: http://shiro.apache.org/
2.Apache Shiro 体系结构
2.1Authentication 认证 ---- 用户登录,身份识别 who are you?
2.2Authorization 授权 --- 用户具有哪些权限、角色 what can you do ?
2.3Cryptography 安全数据加密
2.4Session Management 会话管理
2.5Web Integration web 系统集成
2.6Interations 集成其它应用,spring、缓存框架
3.导入对应的jar包
<!-- 权限控制 框架 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>${shiro.version}</version>
</dependency>
4.参考官方文档:Apache_Shiro_reference(中文版).pdf
5.Apache Shiro执行过程分析和权限控制主要方式
5.1Shiro运行主要运行流程:
ApplicationCode 用户编写代码
Subject 就是 shiro 管理的用户
SecurityManager 安全管理器,是 shiro 权限控制核心对象, 在编程时,只需要操作
Subject 方法, 底层调用 SecurityManager 方法,无需直接编程操作 SecurityManager
Realm 应用程序和安全数据之间连接器 ,应用程序 进行权限控制读取安全数据(数据
表、文件、网路 … ),通过 Realm 对象完成
登录流程: 应用程序 --- Subject --- SecurityManager --- Realm --- 安全数据
5.2Shiro进行权限控制
四种主要方式 :
1、 在程序中 通过 Subject 编程方式进行权限控制
2、 配置 Filter 实现 URL 级别粗粒度权限控制
3、 配置代理,基于注解实现细粒度权限控制
4、 在页面中使用 shiro 自定义标签实现 页面显示权限控制
6.用户登录功能的实现
6.1配置shiro的Filter实现URL级别权限控制
6.1.1配置web.xml
<!-- shiro的Filter -->
<filter>
<!-- 去spring配置文件中寻找同名bean -->
<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>
6.1.2配置applicationContext-shiro.xml
<!-- 配置Shiro核心Filter -->
<bean id="shiroFilter"
class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 安全管理器 -->
<property name="securityManager" ref="securityManager" />
<!-- 未认证,跳转到哪个页面 -->
<property name="loginUrl" value="/login.html" />
<!-- 登录页面页面 -->
<property name="successUrl" value="/index.html" />
<!-- 认证后,没有权限跳转页面 -->
<property name="unauthorizedUrl" value="/unauthorized.html" />
<!-- shiro URL控制过滤器规则 -->
<property name="filterChainDefinitions">
<value>
/login.html* = anon
/user_login.action* = anon
/validatecode.jsp* = anon
/css/** = anon
/js/** = anon
/images/** = anon
/services/** = anon
/pages/base/courier.html* = perms[courier:list]
/pages/base/area.html* = roles[base]
/** = authc
</value>
</property>
</bean>
<!-- 安全管理器 -->
<bean id="securityManager"
class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="bosRealm" />
</bean>
<bean id="lifecycleBeanPostProcessor"
class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
6.2过滤器的参考配置
anon 未认证可以访问
authc 认证后可以访问
perms 需要特定权限才能访问
roles 需要特定角色才能访问
user 需要特定用户才能访问
port 需要特定端口才能访问
reset 根据指定 HTTP 请求访问才能访问
6.3用户登录(认证)功能实现(代码编写)
编写 UserAction 提供 login 登录方法
创建subject对象-->创建token对象用来保存用户输入的数据-->调用subject对象的login方法实现认证登录成功
编写realm类提供shiro的认证管理(doGetAuthenticationInfo)
和授权管理(doGetAuthorizationInfo)(让其继承extends AuthorizingRealm即可实现)
认证管理:将token转换为UsernamePasswordToken-->接着从token中获取当前登录用户的用户名和密码
-->根据用户的用户名查询数据库,获取用户对象(判断是否存在在数据库中)-->不存在retuurn null、
存在return new SimpleAuthenticationInfo(user, user.getPassword(),getName());-->交由securityManager处理
授权管理:创建SimpleAuthorizationInfo授权对象-->获取当前的用户对象(利用subject.getPrincipal();)
-->查询当前用户的所有角色和权限(通过数据jpa获取)-->获取到的用户角色和权限信息
添加到SimpleAuthorizationInfo授权对象中并且返回交由securityManager处理具体的授权模块
6.4用户注销功能实现
只需调用subject的logout()方法即可注销当前登录用户保存在shiro的签名信息中的数据
7.细粒度的基于method的注解式权限管理的实现和jsp页面控制权限菜单的显示参考www.baidu.com;