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