Возможно ли применить безопасность на уровне метода для контроллеров Spring @ MVC?

#spring-mvc #spring-security

#spring-mvc #spring-безопасность

Вопрос:

Я применил приведенный ниже код, но он не работал, может ли кто-нибудь, пожалуйста, дать мне какое-нибудь решение для этого.Спасибо.

Метод контроллера:

 @Controller
public class UserController {
@Secured("ROLE_USER")
@RequestMapping(value="user/{userName}", method=RequestMethod.GET)
    public @ResponseBody User getAvailability(@PathVariable String userName, HttpServletResponse response) { }
}
  

applicationContext-security.xml связанные конфигурации:

     <global-method-security secured-annotations="enabled" />

    <http>
        <intercept-url pattern="/user" requires-channel="https"/>
        <http-basic/>
    </http>

    <authentication-manager alias="authenticationManager">
        <authentication-provider>
            <user-service>
                <user password="password" name="manager" authorities="ROLE_MANAGER"/>
                <user password="password" name="user" authorities="ROLE_USER"/>
            </user-service>
        </authentication-provider>
    </authentication-manager>
  

Ответ №1:

Вы хотите применить защиту с помощью <intercept_url> тега.

Например:

     <intercept-url pattern="/user" requires-channel="https" access="ROLE_USER"/>
  

Комментарии:

1. Привет, ericacm! большое спасибо за ваш ответ, да, со временем я поступал таким образом, но теперь (с более новой Spring Security), похоже, мы можем выполнять те же действия, ограничивающие доступ, на уровне метода, что означает, что вместо выполнения какой-либо конфигурации xml мы можем напрямую указать это для конкретного метода.

Ответ №2:

Если вы хотите использовать управление доступом на основе URL, вам необходимо добавить /**

 <intercept-url pattern="/user/**" requires-channel="https"/>
  

Если вы хотите безопасность на уровне метода, вам нужно

 <context:component-scan base-package="com.yourcompany.etc"/>

<security:global-method-security secured-annotations="enabled"/>
  

также в вашем web.xml вам нужно добавить конфигурацию spring security в качестве параметра в ваш сервлет

 <servlet>
    <servlet-name>myservlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/applicationContext-security.xml</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>
  

Комментарии:

1. Привет, Питер Санто! Большое спасибо за ваш ответ, при таких конфигурациях @Secured не будет работать внутри контроллера Spring (с @Controller).

2. Это работает и на контроллерах, но вам нужно добавить связанный с spring security XML в XML вашего сервлета. По крайней мере, там должен быть <security:global-method-security secured-annotations=»enabled»/>

3. Привет, Питер Санто! Большое спасибо за освобождение. Я попробую это, спасибо.