BOS10——權限控制的實現,apache shiro權限管理框架的使用,參數同名問題,EasyUI的combotree的使用

一、權限控制的實現

二、兩種實現權限管理的方法

1)底層基於攔截器或者過濾器實現css

2)底層基於代理技術實現,爲Action建立代理對象,由代理對象進行權限校驗(實際上Transtion事務註解也是將Service變成動態代理對象)html

三、apache shiro框架的使用

shiro框架的核心功能:

  • 認證
  • 受權
  • 會話管理
  • 加密

shiro框架認證流程:

  • Application Code:應用程序代碼,由開發人員負責開發的
  • Subject:框架提供的接口,表明當前用戶對象
  • SecurityManager:框架提供的接口,表明安全管理器對象
  • Realm:能夠開發人員編寫,框架也提供一些,相似於Dao,用於訪問權限數據

在項目中應用shiro框架進行認證:

1、在realm中進行認證(login)

第一步:引入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配置文件中配置beanidshiroFilter數據庫

第四步:配置安全管理器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"/>

2、使用shiro的方法註解方式權限控制

第一步:在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>

3、使用shiro提供的頁面標籤方式權限控制

第一步:在jsp頁面中引入shiro的標籤庫

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

第二步:使用shiro的標籤控制頁面元素展現

4、總結

URL攔截權限控制(基於過濾器實現)

方法註解權限控制(基於代理技術實現)

 

頁面標籤權限控制(標籤技術實現)

代碼級別權限控制(基於代理技術實現)

 四、參數同名問題

參數同名問題,會先給model賦值
1)刪除model中的字段
2)將page從model中get出來,在給pagebean賦值

五、EasyUI的combotree的使用

combotree插件不能像ztree同樣使用簡單json

相關文章
相關標籤/搜索