java - Spring Security中的自定义表达式

标签 java spring spring-mvc spring-security

我正在使用 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/

相关文章:

Java 并发文件写入 - 应该会失败

java - 创建 jdbc 连接的动态代理以覆盖提交或回滚方法

结合处理 acl_sid 表中的 GrantedAuthority 和 Principle 的 Spring ACL

java - Json Spring : output is xml but I want JSON

java - 尝试在 OS X 中使用 JPL 和 YAP Prolog 时抛出异常

java - 陷入创建查询以从数据库获取结果的困境?

java - 使用 CommandLineRunner spring boot 创建模式

java - java中如何获取图片大小

java - Spring Controller 线程安全

javascript - 如何在Spring MVC中将图像从jsp传递到 Controller