1)底層基於攔截器或者過濾器實現css
2)底層基於代理技術實現,爲Action建立代理對象,由代理對象進行權限校驗(實際上Transtion事務註解也是將Service變成動態代理對象)html
第一步:引入shiro框架相關的jar java
第二步:在web.xml中配置spring框架提供的用於整合shiro框架的過濾器(必定要在Struts的過濾器前)web
<!--過濾器,整合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
第三步:在spring配置文件中配置bean,id爲shiroFilter數據庫
第四步:配置安全管理器apache
<!-- *************************配置shiro框架的過濾工廠************************* --> <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"/> <!--設定URL級別攔截策略--> <property name="filterChainDefinitions"> <value> /css/** = anon /js/** = anon /images/** = anon /validatecode.jsp* = anon /login.jsp = anon /userAction_login.action = anon /page_base_staff.action = perms["staff-list"] /* = authc </value> </property> </bean> <!--配置安全管理器--> <bean name="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="bosRealm"/> </bean>
第五步:修改UserAction中的login方法,使用shiro提供的方式進行認證操做json
/** * 用戶登陸,使用shiro框架提供的方式進行認證操做 */ public String login(){ //從Session中獲取生成的驗證碼 String validatecode = (String) ServletActionContext.getRequest().getSession().getAttribute("key"); //校驗驗證碼是否輸入正確 if(StringUtils.isNotBlank(checkcode) && checkcode.equals(validatecode)){ //使用shiro框架提供的方式進行認證操做 Subject subject = SecurityUtils.getSubject();//得到當前用戶對象,狀態爲「未認證」 AuthenticationToken token = new UsernamePasswordToken(model.getUsername(), MD5Utils.md5(model.getPassword()));//建立用戶名密碼令牌對象 try{ subject.login(token); }catch(Exception e){ e.printStackTrace(); return "login"; } TUser user = (TUser) subject.getPrincipal(); ServletActionContext.getRequest().getSession().setAttribute("loginUser", user); return "home"; }else{ //輸入的驗證碼錯誤,設置提示信息,跳轉到登陸頁面 this.addActionError("輸入的驗證碼錯誤!"); return "login"; } }
第六步:自定義realmtomcat
public class BOSRealm extends AuthorizingRealm { @Autowired private IUserDao userDao; //認證方法 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token){ System.out.println("realm中的認證方法執行了。。。。"); UsernamePasswordToken mytoken = (UsernamePasswordToken)token; String username = mytoken.getUsername(); //根據用戶名查詢數據庫中的密碼 TUser user = userDao.findUserByUserName(username); if(user == null){ //用戶名不存在 return null; } //若是能查詢到,再由框架比對數據庫中查詢到的密碼和頁面提交的密碼是否一致;第一個參數是subject.getPrincipal的返回值類型,第二個是密碼,第三個是任意字符串 AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName()); return info; } //受權方法 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { return null; // retutn是return給安全管理器,return null的話會拋出異常 } }
並注入給安全管理器安全
<!--配置安全管理器--> <bean name="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="bosRealm"/> </bean> <!--註冊自定義的realm--> <bean name="bosRealm" class="cn.x5456.bos.web.realm.BOSRealm"/>
第一步:在spring配置文件中開啓shiro註解支持
<!-- 開啓shiro框架註解支持 --> <bean id="defaultAdvisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"> <!-- 必須使用cglib方式爲Action對象建立代理對象 --> <!-- 緣由:使用jdk版本代理的話,根本沒有Action中的方法 --> <property name="proxyTargetClass" value="true"/> </bean> <!-- 配置shiro框架提供的切面類,用於建立代理對象 --> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"/>
第二步:在Action的方法上使用shiro註解
第三步:在realm中進行受權
//受權方法 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // 獲取用戶對象 TUser user1 = (TUser) SecurityUtils.getSubject().getPrincipal(); TUser user2 = (TUser) principals.getPrimaryPrincipal(); System.out.println(user1==user2); // TODO 根據用戶對象查詢數據庫進行受權 // 直接(不查數據庫)爲用戶受權 info.addStringPermission("staff-list"); return info; }
第四步:在struts.xml中配置全局異常捕獲,當shiro框架拋出權限不足異常時,跳轉到權限不足提示頁面
<global-results> <result name="login" type="redirect">/login.jsp</result> <result name="unauthorized" type="redirect">/redirect.jsp</result> </global-results> <global-exception-mappings> <exception-mapping exception="org.apache.shiro.authz.UnauthorizedException" result="unauthorized"/> </global-exception-mappings>
第一步:在jsp頁面中引入shiro的標籤庫
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
第二步:使用shiro的標籤控制頁面元素展現
URL攔截權限控制(基於過濾器實現)
方法註解權限控制(基於代理技術實現)
頁面標籤權限控制(標籤技術實現)
代碼級別權限控制(基於代理技術實現)
參數同名問題,會先給model賦值
1)刪除model中的字段
2)將page從model中get出來,在給pagebean賦值
combotree插件不能像ztree同樣使用簡單json