spring security 權(quán)限管理

服務(wù)器端方法級權(quán)限控制

在服務(wù)器端我們可以通過Spring security提供的注解對方法來進(jìn)行權(quán)限控制笼恰。
Spring Security在方法的權(quán)限控制上支持三種類型的注解靴寂,JSR-250注解、@Secured注解和支持表達(dá)式的注解,這三種注解默認(rèn)都是沒有啟用的崎逃,需要單獨通過global-method-security元素的對應(yīng)屬性進(jìn)行啟用

JSR-250 注解

jsr-250注解有三個方法實現(xiàn)權(quán)限控制:@RolesAllowed、@PermitAll、@DenyAll
@RolesAllowed:表示具有定義的角色時才可以訪問對應(yīng)的方法
@PermitAll:允許所有角色進(jìn)行訪問缚柏,等于不進(jìn)行權(quán)限控制
@DenyAll:此方法跟@PermitAll正好相反,表示什么角色都不能進(jìn)行訪問
jsr-250主要是在Controller層中指定的方法上使用

1.在 springmvc.xml 配置文件中開啟

<!-- 開啟注解權(quán)限控制 -->
<security:global-method-security jsr250-annotations="enabled"></security:global-method-security>

2.在pom.xml文件中導(dǎo)入 jsr250 的依賴

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>jsr250-api</artifactId>
    <version>1.0</version>
</dependency>

3.在指定的方法上添加注解@RolesAllowed

@RolesAllowed({"USER", "ADMIN"})
public String save(UserInfo userInfo){
    userService.save(userInfo);
    return "redirect:findAll";
}

該方法只要具有 "USER", "ADMIN" 任意一種權(quán)限就可以訪問碟贾。這里可以省略前綴 ROLE_ 币喧,實際的權(quán)限可能是 ROLE_ADMIN
ROLE_USER, ROLE_ADMIN 等權(quán)限需要在 spring-security.xml 配置中定義

       <!-- 配置具體的規(guī)則
            auto-config="true"  不用自己編寫登錄的頁面,框架提供默認(rèn)登錄頁面
            use-expressions="false" 是否使用SPEL表達(dá)式 -->
    <security:http auto-config="true" use-expressions="false">
        <!-- 配置具體的攔截的規(guī)則 pattern="請求路徑的規(guī)則" access="訪問系統(tǒng)的人袱耽,必須有的權(quán)限" -->
        <security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN,ROLE_TEST,ROLE_PRODUCT,ROLE_ORDERS"/>
        <!-- 定義跳轉(zhuǎn)的具體的頁面 -->
        <security:form-login
                login-page="/login.jsp"
                login-processing-url="/login"
                default-target-url="/index.jsp"
                authentication-failure-url="/failer.jsp"
                authentication-success-forward-url="/index.jsp"
        />
        <!-- 關(guān)閉跨域請求 -->
        <security:csrf disabled="true"/>
        <!-- 退出 -->
        <security:logout invalidate-session="true" logout-url="/logout" logout-success-url="/login.jsp"/>
    </security:http>

如果沒有權(quán)限的用戶訪問時杀餐,會跳轉(zhuǎn)403錯誤頁面,體驗不太由友好朱巨,可以指定跳轉(zhuǎn)頁面史翘,需要在web.xml中配置如下信息。如果用戶訪問了沒有權(quán)限的請求地址,會跳轉(zhuǎn)到指定的 403.jsp 頁面
(此處有問題恶座,無法實現(xiàn)跳轉(zhuǎn)搀暑,暫時沒找到原因)

    <error-page>
        <error-code>403</error-code>
        <location>/403.jsp</location>
    </error-page>

@Secured 注解

1.在 springmvc.xml 配置文件中開啟

<!-- 開啟注解權(quán)限控制 -->
<security:global-method-security secured-annotations="enabled"></security:global-method-security>

2.在指定的方法上添加注解 @Secured 注解

@Secured("ROLE_ADMIN")
public String save(UserInfo userInfo){
    userService.save(userInfo);
    return "redirect:findAll";
}

該方法只要具有 "ROLE_USER", "ROLE_ADMIN" 任意一種權(quán)限就可以訪問。這里不可以省略前綴 ROLE_ 跨琳。
ROLE_USER, ROLE_ADMIN 等權(quán)限需要在 spring-security.xml 配置中定義(定義方式同 JSR-250 注解)


基于SPLE表達(dá)式的權(quán)限控制

1.在 springmvc.xml 配置文件中開啟

<!-- 開啟基于SPLE表達(dá)式的注解權(quán)限控制 -->
<security:global-method-security pre-post-annotations="enabled"></security:global-method-security>

2.在指定的方法上添加注解 @PreAuthorize 注解

@PreAuthorize("hasRole(['ROLE_ADMIN','ROLE_USER'])")
public String save(UserInfo userInfo){
    userService.save(userInfo);
    return "redirect:findAll";
}

該方法只要具有 "ROLE_USER", "ROLE_ADMIN" 任意一種權(quán)限就可以訪問自点。

@PreAuthorize("authentication.principal.userName=='admin'")
public String save(UserInfo userInfo){
    userService.save(userInfo);
    return "redirect:findAll";
}

該方法必須是用戶名為admin的用戶才可以訪問。


頁面端標(biāo)簽控制權(quán)限

在jsp頁面中我們可以使用spring security提供的權(quán)限標(biāo)簽來進(jìn)行權(quán)限控制

1.導(dǎo)入

1.1maven導(dǎo)入

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-taglibs</artifactId>
        <version>version</version>
    </dependency>

1.2頁面導(dǎo)入

    <%@taglib uri="http://www.springframework.org/security/tags" prefix="security"%>

2.常用標(biāo)簽

2.1authentication:可以獲取當(dāng)前登錄的用戶的信息

property: 只允許指定Authentication所擁有的屬性脉让,可以進(jìn)行屬性的級聯(lián)獲取桂敛,如“principle.username”,
不允許直接通過方法進(jìn)行調(diào)用
htmlEscape:表示是否需要將html進(jìn)行轉(zhuǎn)義溅潜。默認(rèn)為true术唬。
scope:與var屬性一起使用,用于指定存放獲取的結(jié)果的屬性名的作用范圍滚澜,默認(rèn)我pageContext粗仓。Jsp中擁
有的作用范圍都進(jìn)行進(jìn)行指定
var: 用于指定一個屬性名,這樣當(dāng)獲取到了authentication的相關(guān)信息后會將其以var指定的屬性名進(jìn)行存
放设捐,默認(rèn)是存放在pageConext中

2.1.1獲取當(dāng)前登錄用戶的用戶名借浊,并且顯示在頁面

authentication 標(biāo)簽的 property 屬性

<security:authentication property="principal.username"></security:authentication>

2.2authorize:是用來判斷普通權(quán)限的,通過判斷用戶是否具有對應(yīng)的權(quán)限而控制其所包含內(nèi)容的顯示

access: 需要使用表達(dá)式來判斷權(quán)限萝招,當(dāng)表達(dá)式的返回結(jié)果為true時表示擁有對應(yīng)的權(quán)限
method:method屬性是配合url屬性一起使用的蚂斤,表示用戶應(yīng)當(dāng)具有指定url指定method訪問的權(quán)限,
method的默認(rèn)值為GET槐沼,可選值為http請求的7種方法
url:url表示如果用戶擁有訪問指定url的權(quán)限即表示可以顯示authorize標(biāo)簽包含的內(nèi)容
var:用于指定將權(quán)限鑒定的結(jié)果存放在pageContext的哪個屬性中

2.2.1在 spring-security.xml 配置文件開啟頁面支持SPEL表達(dá)式

開啟表達(dá)式:use-expressions="true"
開啟表達(dá)式后: access 也需要使用表達(dá)式
access="hasAnyRole('ROLE_USER','ROLE_ADMIN','ROLE_TEST','ROLE_PRODUCT','ROLE_ORDERS')"

    <!--
       配置具體的規(guī)則
       auto-config="true"   不用自己編寫登錄的頁面曙蒸,框架提供默認(rèn)登錄頁面
       use-expressions="false"  是否使用SPEL表達(dá)式
    -->
    <security:http auto-config="true" use-expressions="true">
        <!-- 配置具體的攔截的規(guī)則 pattern="請求路徑的規(guī)則" access="訪問系統(tǒng)的人,必須有的角色" -->
        <security:intercept-url pattern="/**"
                                access="hasAnyRole('ROLE_USER','ROLE_ADMIN','ROLE_TEST','ROLE_PRODUCT','ROLE_ORDERS')"/>
        <!-- 定義跳轉(zhuǎn)的具體的頁面 -->
        <security:form-login
                login-page="/login.jsp"
                login-processing-url="/login"
                default-target-url="/index.jsp"
                authentication-failure-url="/failer.jsp"
                authentication-success-forward-url="/index.jsp"
        />
        <!-- 關(guān)閉跨域請求 -->
        <security:csrf disabled="true"/>
        <!-- 退出 -->
        <security:logout invalidate-session="true" logout-url="/logout" logout-success-url="/login.jsp"/>
    </security:http>

如果不想在配置文件開啟表達(dá)式也可在配置文件添加如下 bean岗钩,配置后不開啟表達(dá)式也可以

<bean id="webexpressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler" />

2.2.2在頁面設(shè)置對應(yīng)權(quán)限可以顯示的內(nèi)容

authorize 標(biāo)簽中的 access 屬性

<security:authorize access="hasRole('ROLE_USER')">
    <li id="system-setting">
        <a href="${pageContext.request.contextPath}/user/findAll?page=1&size=5"> 
            <i class="fa fa-circle-o"></i> 用戶管理
        </a>
    </li>
</security:authorize>

有 ROLE_USER 權(quán)限才可以顯示用戶管理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纽窟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子兼吓,更是在濱河造成了極大的恐慌师倔,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件周蹭,死亡現(xiàn)場離奇詭異趋艘,居然都是意外死亡,警方通過查閱死者的電腦和手機凶朗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進(jìn)店門瓷胧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人棚愤,你說我怎么就攤上這事搓萧≡邮” “怎么了?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵瘸洛,是天一觀的道長揍移。 經(jīng)常有香客問我,道長反肋,這世上最難降的妖魔是什么那伐? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮石蔗,結(jié)果婚禮上罕邀,老公的妹妹穿的比我還像新娘。我一直安慰自己养距,他們只是感情好诉探,可當(dāng)我...
    茶點故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棍厌,像睡著了一般肾胯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耘纱,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天敬肚,我揣著相機與錄音,去河邊找鬼揣炕。 笑死,一個胖子當(dāng)著我的面吹牛东跪,可吹牛的內(nèi)容都是我干的畸陡。 我是一名探鬼主播,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼虽填,長吁一口氣:“原來是場噩夢啊……” “哼丁恭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起斋日,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤牲览,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恶守,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體第献,經(jīng)...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年兔港,在試婚紗的時候發(fā)現(xiàn)自己被綠了庸毫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,694評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡衫樊,死狀恐怖飒赃,靈堂內(nèi)的尸體忽然破棺而出利花,到底是詐尸還是另有隱情,我是刑警寧澤载佳,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布炒事,位于F島的核電站,受9級特大地震影響蔫慧,放射性物質(zhì)發(fā)生泄漏挠乳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一藕漱、第九天 我趴在偏房一處隱蔽的房頂上張望欲侮。 院中可真熱鬧,春花似錦肋联、人聲如沸威蕉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽韧涨。三九已至沮焕,卻和暖如春眯搭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背失乾。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工宪哩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留娩贷,地道東北人。 一個月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓锁孟,卻偏偏與公主長得像彬祖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子品抽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,580評論 2 349