Spring Security源碼分析十五:Spring Security 頁面權(quán)限控制

Spring Security是一個(gè)能夠?yàn)榛赟pring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應(yīng)用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反轉(zhuǎn)Inversion of Control ,DI:Dependency Injection 依賴注入)和AOP(面向切面編程)功能,為應(yīng)用系統(tǒng)提供聲明式的安全訪問控制功能,減少了為企業(yè)系統(tǒng)安全控制編寫大量重復(fù)代碼的工作。

前言

Spring Security源碼分析十三:Spring Security 基于表達(dá)式的權(quán)限控制中,我們只是在后臺增加了權(quán)限控制,并未在頁面做任何處理,與之對應(yīng)的按鈕和鏈接還是會顯示在頁面上,用戶體驗(yàn)較差。本章使用Spring Security標(biāo)簽庫來包裹需要保護(hù)的內(nèi)容。

freemarker中使用security標(biāo)簽

增加security標(biāo)簽庫依賴

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
</dependency>

添加ClassPathTldsLoader類加載security.tld

public class ClassPathTldsLoader {
    private static final String SECURITY_TLD = "/META-INF/security.tld";

    final private List<String> classPathTlds;

    public ClassPathTldsLoader(String... classPathTlds) {
        super();
        if(classPathTlds.length == 0){
            this.classPathTlds = Arrays.asList(SECURITY_TLD);
        }else{
            this.classPathTlds = Arrays.asList(classPathTlds);
        }
    }

    @Autowired
    private FreeMarkerConfigurer freeMarkerConfigurer;

    @PostConstruct
    public void loadClassPathTlds() {
        freeMarkerConfigurer.getTaglibFactory().setClasspathTlds(classPathTlds);
    }
}

定義ClassPathTldsLoader Bean

   @Bean
    @ConditionalOnMissingBean(ClassPathTldsLoader.class)
    public ClassPathTldsLoader classPathTldsLoader(){
        return new ClassPathTldsLoader();
    }

頁面中使用標(biāo)簽

<!-- 引入標(biāo)簽-->
<#assign  sec=JspTaglibs["http://www.springframework.org/security/tags"] />
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主頁</title>
</head>
<body align="center">
<h2>Spring Security Demo</h2>
    <!-- freemarker使用security標(biāo)簽格式如下-->
    <@sec.authorize access="hasRole('ROLE_ADMIN')">
    you can see this
    </@sec.authorize>
    <@sec.authorize access="isAnonymous()">
    you can see isAnonymous
    </@sec.authorize>
</body>
</html>

常用的Security標(biāo)簽

authorize

authorize用于判斷用戶是否具有對應(yīng)權(quán)限,從而控制其限制的內(nèi)容,包含以下屬性。

access

access屬性需要使用表達(dá)式來判斷權(quán)限,當(dāng)表達(dá)式的返回結(jié)果為true時(shí)表示擁有對應(yīng)的權(quán)限。

<@sec.authorize access="hasRole('ROLE_ADMIN')">
此內(nèi)容僅對在授予權(quán)限列表中擁有“ROLE_ADMIN”權(quán)限的用戶可見
</@sec.authorize>
--------------------------
<@sec.authorize access="hasPermission(#domain,'read') or hasPermission(#domain,'write')">
只有具有讀取或?qū)懭霗?quán)限的用戶才能看到此內(nèi)容,該用戶被發(fā)現(xiàn)為名為“domain”的請求屬性。
</@sec.authorize>
-----------------------------
<@sec.authorize url="/admin">
此內(nèi)容僅對有權(quán)將請求發(fā)送到“/ admin”鏈接的用戶可見
</@sec.authorize>

authentication

authentication標(biāo)簽用來代表當(dāng)前Authentication對象,主要用于獲取當(dāng)前Authentication的相關(guān)信息。包含以下屬性。

property

property屬性只允許指定Authentication所擁有的屬性。

<!--獲取當(dāng)前用戶的用戶名-->
<@sec:authentication property="principal.username" />
var屬性

var屬性用于指定一個(gè)屬性名,這樣當(dāng)獲取到了authentication的相關(guān)信息后會將其以var指定的屬性名進(jìn)行存放,默認(rèn)是存放在pageConext中??梢酝ㄟ^scope屬性進(jìn)行指定。此外,當(dāng)指定了var屬性后,authentication標(biāo)簽不會將獲取到的信息在頁面上進(jìn)行展示,如需展示用戶應(yīng)該通過var指定的屬性進(jìn)行展示,或去掉var屬性。

 <@sec.authentication property="principal.username" scope="session" var="username"/>
${username }

accesscontrollist

該標(biāo)簽只有在與spring security的acl模塊一起使用時(shí)才有效。它會檢查指定域?qū)ο蟮谋匦铏?quán)限的逗號分隔列表。如果當(dāng)前用戶擁有所有這些權(quán)限,則會評估標(biāo)簽正文。如果他們不這樣做,它將被跳過。

<@sec.accesscontrollist hasPermission="1,2" domainObject="${someObject}">
如果用戶具有給定對象上的值“1”或“2”表示的所有權(quán)限,則會顯示此信息
</@sec.accesscontrollist>

代碼下載

從我的 github 中下載,https://github.com/longfeizheng/logback


[圖片上傳失敗...(image-48b4a2-1520346223416)]

??????關(guān)注微信小程序java架構(gòu)師歷程
上下班的路上無聊嗎?還在看小說、新聞嗎?不知道怎樣提高自己的技術(shù)嗎?來吧這里有你需要的java架構(gòu)文章,1.5w+的java工程師都在看,你還在等什么?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,697評論 19 139
  • 在我搭建基于Spring Cloud的微服務(wù)體系應(yīng)用的時(shí)候所需要或者是常用的屬性配置文件,還有這些屬性的用途,此配...
    StrongManAlone閱讀 4,305評論 0 18
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,288評論 6 342
  • 要加“m”說明是MB,否則就是KB了. -Xms:初始值 -Xmx:最大值 -Xmn:最小值 java -Xms8...
    dadong0505閱讀 5,075評論 0 53
  • ▲魚丸的制作第一步是挑魚,花鰱是最好的選擇,也可以選擇白鰱、草魚,去鱗、剔肉,洗凈備用。 ▲切姜、蔥。 ▲將魚肉切...
    影享視頻閱讀 642評論 0 2

友情鏈接更多精彩內(nèi)容