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"/>