Adnotacj @preAuthorized

0

Witam,

pojawił się problem z adnotacją @PreAuthorize. Projekt oparty o Spring, wykorzystuje
MVC i autoryzację za pomocą Spring Security. Użytkownik autoryzuje się z rolą ROLE_ADMIN i chciałbym, aby pewna metoda klasy, która implementuje interfejs opisujący operacje wykonywana mogła być tylko i wyłącznie przez osoby z ROLE_USER. W tym celu w security-context.xml użyłem

<global-method-security pre-post-annotations="enabled" proxy-target-class="true"/>

Testowy interfejs klasy następujący:

import org.springframework.security.access.prepost.PreAuthorize;

public interface SessionGuard {
	
	@PreAuthorize("hasRole('ROLE_USER')")
	public void tescik();
	
}

Testowa klasa:

import org.springframework.stereotype.Component;

@Component
public class SessionGuardImpl implements SessionGuard {

	@Override
	public void tescik() {
		// TODO Auto-generated method stub
		System.out.println("test");
	}

}

Metodę teścik() wywołuję z mojego controlera i niestety wykonuje sie nawet, gdy użytkownik jest autoryzowany z rola ROLE_ADMIN.

0

Wyrażenie w PreAuthorize to zwykłe wyrażenie w SPeL ;) Spróbuj:
@PreAuthorize("hasRole('ROLE_USER') AND !hasRole('ROLE_ADMIN')")

0

Próbowałem też tak podejść do tematu, jednak nie przynosi do pożądanego rezultatu ... Tak jakby ta adnotacja nie była w ogóle interpretowana.

0

Pokaż kontroler, w którym wywołujesz serwis.

0
@Controller
@SessionAttributes({"imie", "nazwisko", "listklasy"})
public class HomeController {
	
	public ModelAndView modelAndView;
	
	@Autowired
	public SessionGuard sessiong;


	@PreAuthorize("hasRole('ROLE_USER')")
	public void Test(){
		
		System.out.println("testCONTROLLER");
	}
		@RequestMapping(value="/", method = RequestMethod.GET)
		public String Glowna(Model model)
	{		
		sessiong.tescik();                // Test 1
		this.Test();                         // Test 2
		
		return "firstpage";
	}
	


}

Kontroler posiada szereg innych metod, jednak nie wnoszą nic one do sprawy, więc pozwoliłem sobie zostawić dwie istotne, wraz ze wszystkimi adnotacjami.

UPDATE

Po skonfigurowaniu WEB.XML w taki sposób zaczyna stosować się do adnotacji:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml
						/WEB-INF/spring/appServlet/security-context.xml                                        // TO BYLO WCZESNIJ
		</param-value>
	</context-param>
	
	<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	
	<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml                            
	/WEB-INF/spring/appServlet/security-context.xml                                                  // TU DODALEM LINIJKE
			</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>



</web-app>

Efektem jak już wspomniałem jest stosowanie się do adnotacji, ale gdy zaloguje się z rolą inna niż wskazana w adnotacji to dostaję 403 - Access is denied.

DEBUG o.s.s.w.a.ExceptionTranslationFilter - Access is denied (user is anonymous); redirecting to authentication entry point
org.springframework.security.access.AccessDeniedException: Access is denied

Konfiguracja intercept-url jest prawodłowa.

Jeżeli nie wywołam metody tescik() oraz Test() wszystko jest ok.

Możliwe, że te konteksty się przełączają i jeden nie wie nic o drugim ?? Od niedawna usiadłem przy tej technologi i za mało czasu jeszcze upłynęło żebym to ogarnął w takim stopniu w jakim bym sobie tego życzył ;) Będę wdzięczny za każdą wskazówkę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1