Acegi的標籤庫authzauthorize

白展糖發表於2012-12-11
由於前面程式設計師有用到這個東西,自己又不懂,上網查一篇不能轉載,所以就直接cp過來了,希望原作者原諒!在著多謝了
11.4.6  使用Acegi的標籤庫
稱之為標籤庫可能有點言過其辭了。實際上,Acegi只提供了一個JSP標籤:<authz:authorize>標籤。

雖然Acegi的安全強制過濾器能夠阻止使用者瀏覽他們沒有許可權看到的頁面,但最好的做法是從一開始就不提供指向受限制頁面的連結。<authz:authorize>標籤能夠根據當前使用者是否擁有恰當許可權來決定顯示或隱藏Web頁面的內容。

<authz:authorize>是一個流程控制標籤,能夠在滿足特定安全需求的條件下顯示它的內容體。它有三個互斥的引數:

n  
ifAllGranted――是一個由逗號分隔的許可權列表,使用者必須擁有所有列出的許可權才能渲染標籤體;
n  
ifAnyGranted――是一個由逗號分隔的許可權列表,使用者必須至少擁有其中的一個才能渲染標籤體;
n  
ifNotGranted――是一個由逗號分隔的許可權列表,使用者必須不擁有其中的任何一個才能渲染標籤體。
你可以輕鬆地想像在JSP中如何使用<authz:authorize>標籤根據使用者的許可權來限制他們的行為。例如,Spring培訓應用有一個向使用者顯示課程有關資訊的課程明細頁面。對管理員來說,如果能夠從課程明細頁面直接跳轉到課程編輯頁面從而可以更新課程資訊是很方便的。但你不希望這個連結對除了管理員之外的其他使用者可見。

使用<authz:authorize>標籤,在使用者沒有管理員許可權的情況下,你可以避免渲染到課程編輯頁面的連結:

 
  <authz:authorize
ifAllGranted=”ROLE_ADMINISTRATOR”>  
對大小寫是敏感的!USER和user是不一樣的
   
<a
href=”admin/editCourse.htm?courseId=${course.id}”>

     
Edit Course
   
</a>
 
</authz:authorize>
 
這裡,我們使用了ifAllGranted引數,由於這裡只需要檢查一個授權,所以ifAllGranted標籤也是可以使用的。Web應用的安全性只是Acegi功能的一個方面。現在讓我們考察它的另一面――保護方法呼叫。

   保護方法呼叫
雖然Acegi保護Web請求的手段是使用Servlet過濾器,它卻是利用Spring對AOP的支援來提供方法級別的宣告式保護的。這意味著不是設定一個SecurityEnforcementFilter來強制安全性,而是設定一個Spring
AOP代理來攔截方法呼叫,並將控制轉交給安全攔截器。

在有javaScript指令碼中有時不方便引用acegi標籤,可以從SecurityContextHolder中獲得許可權集合,然後判斷當前登入的使用者,其許可權集合中是否有某許可權,根據判斷結果來決定顯示或隱藏哪些頁面元素,見下面的JSP:

<%@ page contentType=”text/html;
charset=GBK”%>
<%@ taglib uri=”/WEB-INF/struts-html.tld”
prefix=”html” %>
<%@ taglib uri=”/WEB-INF/struts-bean.tld”
prefix=”bean” %>
<%@ taglib uri=”/WEB-INF/struts-logic.tld”
prefix=”logic”%>
<%@ taglib uri=”http://acegisecurity.sf.net/authz”
prefix=”authz”%>
<%@ page import=”org.acegisecurity.Authentication”
%>
<%@ page
import=”org.acegisecurity.context.SecurityContext”
%>
<%@ page
import=”org.acegisecurity.context.SecurityContextHolder”
%>
<%@ page
import=”org.acegisecurity.userdetails.UserDetails”
%>
<%@ page
import=”org.acegisecurity.ui.AccessDeniedHandlerImpl”
%>
<%@ page
import=”org.springframework.aop.framework.ProxyFactoryBean”%>

<%@ page
import=”org.springframework.context.ApplicationContext”%>

<%@ page
import=”org.springframework.context.support.ClassPathXmlApplicationContext”%>

<%@ page
import=”org.acegisecurity.GrantedAuthority”%>
<%@ page
import=”com.mysoft.common.ValidateAcegiAuth”%>
<%
SecurityContext ctx = SecurityContextHolder.getContext();
%>
。。。
<script language=”JavaScript”
type=”text/javascript”>
//下面是呼叫自定義的類ValidateAcegiAuth,輸入當前登入使用者的SecurityContext,及許可權碼,如果有AUTH_FUN_TICKET_CHKERR許可權,則執行相應的JS指令碼。

<%if(ValidateAcegiAuth.validate(ctx,”AUTH_FUN_TICKET_CHKERR”)){%>

//具有AUTH_FUN_TICKET_CHKERR 許可權,執行相應js指令碼…
<%}%>
</script>
下面是ValidateAcegiAuth類的程式碼:
package com.mysoft.common;
import org.acegisecurity.Authentication;
import org.acegisecurity.context.SecurityContext;
import org.acegisecurity.context.SecurityContextHolder;
import org.acegisecurity.userdetails.UserDetails;
import org.acegisecurity.ui.AccessDeniedHandlerImpl;
import org.springframework.aop.framework.ProxyFactoryBean;
import org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;

import org.acegisecurity.GrantedAuthority;

public class ValidateAcegiAuth
{

public static boolean validate(SecurityContext ctxLoginUser,String
sAuthID)
{
boolean bool = false;
Authentication authLoginUser = null;
GrantedAuthority[] arrayAuthorities = null;
if(ctxLoginUser!=null)
{
authLoginUser = ctxLoginUser.getAuthentication();
if(authLoginUser!=null)
{
arrayAuthorities = authLoginUser.getAuthorities();
for(int i=0;i<arrayAuthorities.length;i++)
{
if(arrayAuthorities[i].toString().equals(sAuthID))
{
bool = true;
break;
}
}
}
else
{
bool = false;
}
}
else
{
bool = false;
}
return bool;
}
}


相關文章