Spring SecurityJSPtaglibsを使用してロールに基づいて条件付きでいくつかのコンテンツを表示したいと思います。しかし、Spring Security 3.1.xでは、1つの役割のみをチェックしています。
使用できますが、ifAllGrantedは非推奨です。
何か助けはありますか?
Spring SecurityJSPtaglibsを使用してロールに基づいて条件付きでいくつかのコンテンツを表示したいと思います。しかし、Spring Security 3.1.xでは、1つの役割のみをチェックしています。
使用できますが、ifAllGrantedは非推奨です。
何か助けはありますか?
春のセキュリティには特別なセキュリティ表現があります。
hasAnyRole(ロールのリスト) -ユーザーに指定されたロールのいずれかが付与されている場合はtrue(文字列のコンマ区切りリストとして指定)。
私はそれを使ったことがありませんが、まさにあなたが探しているものだと思います。
使用例:
<security:authorize access="hasAnyRole('ADMIN', 'DEVELOPER')">
...
</security:authorize>
これは、標準のスプリングセキュリティ式が説明されているリファレンスドキュメントへのリンクです。また、必要に応じてカスタム式を作成する方法についても説明しました。
@dimasの答えはあなたの質問と論理的に一致していません。ifAllGranted
に直接置き換えることはできませんhasAnyRole
。
年:
<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で非推奨)メソッドは、認証されたプリンシパルに指定されたすべてのロールが含まれている場合にのみ返されます。true
ifAllGranted
true
TL; DRifAllGranted
: Spring Security Taglibの新しい認証式言語を使用する動作を複製するには、hasRole('ROLE_1') and hasRole('ROLE_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">
使用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>
SpringBoot2.4内では
sec:authorize="hasAnyRole('ROLE_ADMIN')
あなたが持っていることを確認してください
thymeleaf-extras-springsecurity5
あなたの依存関係で。また、名前空間が含まれていることを確認してください
xmlns:sec="http://www.thymeleaf.org/extras/spring-security"
あなたのhtmlで...