Acegi的標籤庫authzauthorize
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;
}
}
相關文章
- JSP簡單標籤標籤庫開發JS
- 什麼是JSTL標籤?常用的標籤庫有哪些?JS
- JSP標籤庫介紹(1)什麼是標籤庫? (轉)JS
- 建立自定義標籤庫
- Struts標籤庫詳解
- struts2 標籤庫
- JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】JS
- HTML標籤(基本標籤的使用)HTML
- java <%!%>標籤和<%%>標籤的使用Java
- html中常用的標籤-表格標籤HTML
- 關於自定義標籤庫
- 有關自定義標籤庫
- JSP標籤庫介紹(1)定製標籤內幕 (轉)JS
- html中常用的標籤-表單標籤HTML
- jsp如何自定義tag的標籤庫?JS
- properties標籤和typeAliases標籤
- Java Web(七) JSTL標籤庫JavaWebJS
- 淺談Acegi配置
- html中常用的標籤-超連結標籤HTML
- Docker檢視遠端倉庫的標籤工具Docker
- .net將資料庫中的html標籤展示資料庫HTML
- 關於標籤庫的問題,請求援助
- 推送標籤到遠端倉庫的步驟
- 自定義標籤【迭代標籤】薦
- PHP歷理 列表模板和標籤庫PHP
- PHP歷理 新增模板和標籤庫PHP
- PHP歷理 修改模板和標籤庫PHP
- From Java EE security to AcegiJava
- "JSTL"的標籤庫和"Struts"的標記庫的問題?JS
- VOC標籤轉化為YOLO標籤YOLO
- Struts標籤、ognl表示式、el表示式、jstl標籤庫這四者之間JS
- PbootCMS可使用的列表標籤內容tags標籤呼叫boot
- html的基本標籤HTML
- HTML 的常用標籤HTML
- 熟悉的< script >標籤
- html <a>標籤的妙用HTML
- html的頭標籤HTML
- HTML 標籤的使用HTML