Obecnie korzystam z usługi sieciowej obsługującej podstawowe uwierzytelnianie przez Tomcat. Okno logowania wyskakuje dobrze i mogę zalogować się na konta, które zdefiniowałem w pliku tomcat-users.xml. Jednak jeśli chodzi o definiowanie uprawnień na podstawie ról, mam pewne problemy.
Obecnie pełnię trzy role: menedżera, administratora i użytkownika. Mam kilka metod, do których dostęp powinien mieć, powiedzmy, administrator. Mogę zalogować się jako moje superkonto menedżera/administratora/użytkownika i widzieć wszystko w porządku, ale mogę też zrobić to samo, co normalny użytkownik.
Metody są zdefiniowane w następujący sposób:
@Path("/Test")
@RolesAllowed("admin")
public class Test
{
@GET
@RolesAllowed("user")
public methodThatMyUsersCanAcess{}
@GET
@Path("/Secure")
@RolesAllowed("admin")
public methodThatOnlyAdminsCanAcess{}
}
Naprawdę nie jestem pewien, w jaki sposób rola „użytkownika” mogłaby uzyskać dostęp do drugiej metody, ale jakoś tak się dzieje.
2 odpowiedzi
Po dalszych badaniach odkryłem, że używanie @RolesAllowed
nic nie robi w moim kodzie ze względu na sposób konfiguracji mojego pliku web.xml. Postanowiłem pójść w kierunku ustawiania uwierzytelniania po ścieżce URI. Odbywa się to poprzez modyfikację pliku web.xml, aby umożliwić podzbiorowi użytkowników dostęp do każdej ścieżki pod osobnymi znacznikami <security-constraint>
. Najlepsze źródło informacji znalazłem tutaj: http://www.coderanch.com/t/176095/java-Web-Component-SCWCD/certification/auth-constraint-confusion w drugim poście.
Kluczowym punktem jest skonfigurowanie RolesAllowedResourceFilterFactory
w web.xml, jak poniżej:
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.mycompany.mobile.rest</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.feature.Trace</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.mycompany.mobile.rest.filter.RestSecurityFilter</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ResourceFilters</param-name>
<param-value>com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Podobne pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].
/Test
są mapowane domethodTheMyUsersCanAccess
i powinny być dostępne tylko dla roliuser
, a/Test/Secure
mapuje domethodThatOnlyAdminsCanAccess
i jest dostępny tylko dla roliadmin
. Adnotacja@RolesAllowed
pochodzi z JSR 250, która stwierdza, że jej użycie w metodzie powinno przesłonić jej użycie na poziomie klasy. Co się stanie, gdy usuniesz adnotację@RolesAllowed
z poziomu zajęć?