48

Spring SecurityJSPtaglibsを使用してロールに基づいて条件付きでいくつかのコンテンツを表示したいと思います。しかし、Spring Security 3.1.xでは、1つの役割のみをチェックしています。

使用できますが、ifAllGrantedは非推奨です。

何か助けはありますか?

4

5 に答える 5

89

春のセキュリティには特別なセキュリティ表現があります。

hasAnyRole(ロールのリスト) -ユーザーに指定されたロールのいずれかが付与されている場合はtrue(文字列のコンマ区切りリストとして指定)。

私はそれを使ったことがありませんが、まさにあなたが探しているものだと思います。

使用例:

<security:authorize access="hasAnyRole('ADMIN', 'DEVELOPER')">
    ...
</security:authorize>

これは、標準のスプリングセキュリティ式が説明されているリファレンスドキュメントへのリンクです。また、必要に応じてカスタム式を作成する方法についても説明しました

于 2012-07-13T11:11:25.653 に答える
8

@dimasの答えはあなたの質問と論理的に一致していません。ifAllGrantedに直接置き換えることはできませんhasAnyRole

Spring Security 3—> 4移行ガイドから:

年:

<sec:authorize ifAllGranted="ROLE_ADMIN,ROLE_USER">
    <p>Must have ROLE_ADMIN and ROLE_USER</p>
</sec:authorize>

新規(SPeL):

<sec:authorize access="hasRole('ROLE_ADMIN') and hasRole('ROLE_USER')">
    <p>Must have ROLE_ADMIN and ROLE_USER</p>
</sec:authorize>

ifAllGrantedで直接置き換えるhasAnyRoleと、springは。のOR代わりにステートメントを使用してステートメントを評価しANDます。つまり、認証されたプリンシパルに指定されたロールが少なくとも1つhasAnyRole含まれている場合に返されますが、Springの(現在Spring Security 4で非推奨)メソッドは、認証されたプリンシパルに指定されたすべてのロールが含まれている場合にのみ返されます。trueifAllGrantedtrue

TL; DRifAllGranted : Spring Security Taglibの新しい認証式言語を使用する動作を複製するには、hasRole('ROLE_1') and hasRole('ROLE_2')パターンを使用する必要があります。

于 2016-11-18T00:50:12.867 に答える
2

thymeleafを使用している場合は、この方法で試すことができます

sec:authorize="hasAnyRole(T(com.orsbv.hcs.model.SystemRole).ADMIN.getName(),
               T(com.orsbv.hcs.model.SystemRole).SUPER_USER.getName(),'ROLE_MANAGEMENT')"

これは、ユーザーが上記の役割を持っている場合はtrueを返し、そうでない場合はfalseを返します。

このようにhtml宣言タグでsecタグを使用する必要があることに注意してください

<html xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
于 2019-09-18T07:59:49.843 に答える
1

使用hasAnyRole('ROLE_ADMIN','ROLE_USER')しましたが、エラーの下でBeanが作成されていました

Error creating bean with name     'org.springframework.security.web.access.intercept.FilterSecurityInterceptor#0': Cannot create inner bean '(inner bean)' of type [org.springframework.security.web.access.expression.ExpressionBasedFilterInvocationSecurityMetadataSource] while setting bean property 'securityMetadataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#2': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.security.web.access.expression.ExpressionBasedFilterInvocationSecurityMetadataSource]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: Expected a single expression attribute for [/user/*]

それから私は試しました

access="hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')"そしてそれは私にとってはうまく機能しています。

私のユーザーの1人は、ユーザーであると同時に管理者でもあります。

use-expressions="true" auto-config="true"このためには、httpタグを追加してから追加する必要があります

<http use-expressions="true" auto-config="true" >.....</http>
于 2015-08-13T13:33:51.327 に答える
1

SpringBoot2.4内では

sec:authorize="hasAnyRole('ROLE_ADMIN')

あなたが持っていることを確認してください

thymeleaf-extras-springsecurity5

あなたの依存関係で。また、名前空間が含まれていることを確認してください

xmlns:sec="http://www.thymeleaf.org/extras/spring-security"

あなたのhtmlで...

于 2020-11-28T16:10:58.857 に答える