我正在使用 Java、Spring 和 Mybatis 开发 Web 安全应用程序。我使用 Rest Controller 向前端提供数据。在后端,我通过以下方式保护 Rest Controller :
<sec:global-method-security
pre-post-annotations="enabled" secured-annotations="enabled"
metadata-source-ref="customMetadataSource" />
<beans:bean id="customMetadataSource"
class="org.dummy.CustomMetadataSource">
<beans:constructor-arg>
<beans:map>
<beans:entry
key="#{T(org.dummy.RoleAuthenticatedUser)}"
value="hasRole('ROLE_AUTHENTICATED_USER')" />
</beans:map>
</beans:constructor-arg>
<beans:constructor-arg>
<beans:bean
class="org.springframework.security.access.expression.method.ExpressionBasedAnnotationAttributeFactory">
<beans:constructor-arg>
<beans:bean
class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler" />
</beans:constructor-arg>
</beans:bean>
</beans:constructor-arg>
</beans:bean>
注释@RoleAuthenticatedUser非常简单:
@java.lang.annotation.Target(value={java.lang.annotation.ElementType.METHOD,java.lang.annotation.ElementType.TYPE})
@java.lang.annotation.Retention(value=java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.annotation.Inherited
@java.lang.annotation.Documented
public @interface RoleAuthenticatedUser {
}
当我想要保护 REST Web 服务时,我只需使用此注释来装饰它即可。
@RoleAuthenticatedUser
@Transactional
@Benchmark
@GetMapping(value = RICHIESTA_ABILITAZIONE_DOCUMENTI_URL, headers = "Accept="
+ MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<RichiestaAccesso> impostaAbilitazioneDocumenti(@AuthenticationPrincipal JwtUser user, @PathVariable("richiestaAccesso") String idRichiestaAccesso, @PathVariable("codiceFiscale") String codiceFiscale, @PathVariable("abilita") boolean abilitazioneDocumenti) {
return ...;
}
public interface JwtUser extends UserIdentity {
long getLastAccessedTime();
long getDurationTime();
String getUid();
void touched();
boolean isValid();
List<ProfiloUtente> getProfiles();
}
我将 JwtUser
定义为主体,因此当我调用 Authentication.getPrincipal
时,我收到一个 JwtUser
对象。
它工作得很好,没有任何问题。我想添加另一个注释来检查用户 (JwtUser) 是否至少有 2 个配置文件(我需要检查 getProfiles
列表)。为了完成此任务,我通过以下方式扩展配置:
<beans:bean id="customMetadataSource"
class="it.insiel.stt.interrogazioni.web.security.CustomMetadataSource">
<beans:constructor-arg>
<beans:map>
<beans:entry
key="#{T(org.dummy.RoleAuthenticatedUser)}"
value="hasRole('ROLE_AUTHENTICATED_USER')" />
<beans:entry
key="#{T(org.dummy.RoleProfiledUser)}"
value="hasRole('ROLE_AUTHENTICATED_USER') and authentication.principal.profiles.size>1" />
</beans:map>
</beans:constructor-arg>
<beans:constructor-arg>
<beans:bean
class="org.springframework.security.access.expression.method.ExpressionBasedAnnotationAttributeFactory">
<beans:constructor-arg>
<beans:bean
class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler" />
</beans:constructor-arg>
</beans:bean>
</beans:constructor-arg>
</beans:bean>
正如您所注意到的,我只是添加了另一个注释,名为 @RoleProfiledUser,并将其关联到以下表达式:
hasRole('ROLE_AUTHENTICATED_USER') and authentication.principal.profiles.size>1
我将其关联到 REST Controller ,但它不起作用。有什么错误吗?谢谢
最佳答案
终于找到错误了。只需添加括号即可!
hasRole('ROLE_AUTHENTICATED_USER') and authentication.principal.profiles.size()>1
关于java - Spring Security中的自定义表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53225914/