Я работаю над приложением веб-безопасности с 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, но он не работает.В чем ошибка?Спасибо