пользовательское выражение в весенней безопасности - PullRequest
0 голосов
/ 09 ноября 2018

Я работаю над приложением веб-безопасности с Java, Spring и Mybatis.Я использовал контроллеры 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 {

}

Когда я хочу изолировать REST-веб-сервис, я просто украшаю егоэта аннотация.

@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, но он не работает.В чем ошибка?Спасибо

1 Ответ

0 голосов
/ 11 ноября 2018

Наконец-то я нашел ошибку.Просто добавьте скобки и все работает!

hasRole('ROLE_AUTHENTICATED_USER') and authentication.principal.profiles.size()>1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...