springsecurity中的自定义表达式



我正在使用Java、Spring和Mybatis开发一个web安全应用程序。我使用Rest控制器向前端提供数据。在后端,我用保护Rest控制器

<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 {
}

当我想保护RESTWeb服务的安全时,我只需用这个注释来装饰它。

@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定义为Principal,所以当我调用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控制器,但它不起作用。错在哪里?谢谢

最后,我发现了错误。只要加上括号就可以了!

hasRole('ROLE_AUTHENTICATED_USER') and authentication.principal.profiles.size()>1

最新更新