1 学习计划
1, 演示权限 demo
2, 权限概述
n 认证
n 授权
3, 常见的权限控制方式
n url 拦截权限控制
n 方法注解权限控制
4, 创建权限数据模型
n 权限表
n 角色表
n 用户表
n 角色权限关系表
n 用户角色关系表
5,apache shiro 框架简介
n 官网和下载
n 框架核心功能
n 框架调用流程
6, 基于 shiro 框架进行认证操作
2 演示权限 demo
如何运行项目:
第一步: 在 eclipse 中引入上面的项目
第二步: 创建一个数据库 privilegedemo, 并执行项目中的 sql 脚本
第三步: 启动项目, 可以完成自动建表, 为 itcast_user 表插入一条初始化数据
3 权限概述
认证: 系统提供的用于识别用户身份的功能, 通常登录功能就是认证功能 ----- 让系统知道你是谁??
授权: 系统授予用户可以访问哪些功能的许可 (证书)---- 让系统知道你能做什么??
4 常见的权限控制方式
4.1 URL 拦截权限控制
底层基于拦截器或者过滤器实现
4.2 方法注解权限控制
底层基于代理技术实现, 为 Action 创建代理对象, 由代理对象进行权限校验
5 创建权限数据模型
l 权限表
l 角色表
l 用户表
l 角色权限关系表
l 用户角色关系表
角色就是权限的集合, 引入角色表, 是为了方便授权
6 apache shiro 框架简介
官网: shiro.apache.org
l 下载文件:
l shiro 框架的核心功能:
认证
授权
会话管理
加密
l shiro 框架认证流程
Application Code: 应用程序代码, 由开发人员负责开发的
Subject: 框架提供的接口, 代表当前用户对象
SecurityManager: 框架提供的接口, 代表安全管理器对象
Realm: 可以开发人员编写, 框架也提供一些, 类似于DAO, 用于访问权限数据
7 在 BOS 项目中应用 shiro 框架进行认证
第一步: 引入 shiro 框架相关的 jar
- <!-- 引入 shiro 框架的依赖 -->
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-all</artifactId>
- <version>1.2.2</version>
- </dependency>
第二步: 在 web.xml 中配置 spring 框架提供的用于整合 shiro 框架的过滤器 (记得放在 struct 过滤器的上方)
- <!-- 配置 shiro 框架过滤器 -->
- <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>
启动 tomcat 服务器, 抛出异常: spring 工厂中不存在一个名称为 "shiroFilter" 的 bean 对象
第三步: 在 spring 配置文件中配置 bean,id 为 shiroFilter
- <!-- 配置 shiro 过滤器工厂 bean -->
- <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
- <property name="securityManager" ref="securityManager"/>
- <property name="loginUrl" value="/login.jsp"/>
- <property name="successUrl" value="/index.jsp"/>
- <property name="unauthorizedUrl" value="/unauthorized.jsp"/>
- <property name="filterChainDefinitions">
- <value>
- /CSS/** = anon
- /js/** = anon
- /images/** = anon
- /login.jsp* = anon
- /validatecode.jsp* = anon
- /userAction_login.action = anon
- /page_base_staff.action = perms["staff"]
- /* = authc
- </value>
- </property>
- </bean>
/** 的意思是所有文件夹及里面的子文件夹
/* 是所有文件夹, 不含子文件夹
/ 是 web 项目的根目录
一级和多级的区别
框架提供的过滤器: anon 代表可以匿名访问....
第四步: 配置安全管理器
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
</bean>
第五步: 修改 UserAction 中的 login 方法, 使用 shiro 提供的方式进行认证操作
- public String login() {
- String key = (String) ServletActionContext.getRequest().getSession().getAttribute("key");
- if (StringUtils.isNotBlank(key) && checkcode.equals(key)) {
- // 验证码正确
- Subject subject = SecurityUtils.getSubject();
- // 用户密码令牌
- AuthenticationToken token = new UsernamePasswordToken(model.getUsername(),MD5Utils.md5(model.getPassword()));
- try{
- subject.login(token);
- User u = (User) subject.getPrincipal();
- ServletActionContext.getRequest().getSession().setAttribute("User", u);
- }catch(Exception e){
- e.printStackTrace();
- return LOGIN;
- }
- return "home";
- } else {
- // 验证码错误
- this.addActionError("输入的验证码错误!");
- return LOGIN;
- }
- }
第六步: 自定义 realm, 并注入给安全管理器
- public class BOSRealm extends AuthorizingRealm{
- @Autowired
- private IUserDao userDao;
- // 认证方法
- protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
- System.out.println("realm 中的认证方法执行了....");
- UsernamePasswordToken mytoken = (UsernamePasswordToken)token;
- String username = mytoken.getUsername();
- // 根据用户名查询数据库中的密码
- User user = userDao.findUserByUserName(username);
- if(user == null){
- // 用户名不存在
- return null;
- }
- // 如果能查询到, 再由框架比对数据库中查询到的密码和页面提交的密码是否一致
- AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());
- return info;
- }
- // 授权方法
- protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
- // TODO Auto-generated method stub
- return null;
- }
最后修改一下 spring 配置文件里面的 securityManger, 注入 Realm:
- <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
- <property name="realm" ref="bosRealm"/>
- </bean>
- <bean id="bosRealm" class="com.xyp.bos.realm.BOSRealm"/>
来源: https://www.cnblogs.com/xieyupeng/p/8940403.html