2016-01-24 4 views
0

Окружающая среда:Spring MVC REST + Spring Security + Базовая аутентификация

Spring 4,1

Весна безопасности 4,0

Выпуск:

Я разрабатываю простой службы REST с помощью Spring 4.1. И использование Spring для проверки подлинности. Я использую HTTP Basic Authentication.

Проблема заключается в том, что базовая аутентификация не работает даже после правильной настройки. Я использую почтальон для отправки запроса на сервер. Клиент REST может вызывать метод контроллера REST без заголовка авторизации. Метод успешно выполняется без какой-либо ошибки аутентификации.

Поскольку я использую Tomcat 6, я не использую функции сервлета 3.0, поэтому web.xml существует. Уровень безопасности уровня реализован с использованием аннотации @Secured на уровне контроллера REST.

Может кто-нибудь, пожалуйста, помогите, куда я иду не так?

Код:

web.xml:

<web-app> 
    <display-name>Archetype Created Web Application</display-name> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <listener> 
     <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
    </listener> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/mvc-dispatcher-servlet-security.xml</param-value> 
    </context-param> 

    <servlet> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value> 
     </init-param>  
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <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> 
     <dispatcher>FORWARD</dispatcher> 
     <dispatcher>REQUEST</dispatcher>  
    </filter-mapping> 

</web-app> 

MVC-сервлет-диспетчерская-security.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/security 
     http://www.springframework.org/schema/security/spring-security-4.0.xsd 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"> 

    <http use-expressions="true" create-session="stateless"> 
     <http-basic/> 
     <csrf disabled="true"/> 
    </http> 

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

    <authentication-manager> 
     <authentication-provider> 
      <user-service> 
       <user name="XYZ" password="12345" authorities="ROLE_USER" /> 
      </user-service> 
     </authentication-provider> 
    </authentication-manager> 

</beans:beans> 

MVC-диспетчерская-servlet.xml :

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <!-- Specifying base package of the Components like Controller, Service, DAO --> 
    <context:component-scan base-package="org.ngo" /> 
    <!-- Getting Database properties --> 
    <context:property-placeholder location="classpath:application.properties"/> 

    <mvc:annotation-driven/> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="${jdbc.driverClassName}" /> 
     <property name="url" value="${jdbc.url}" /> 
     <property name="username" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}" /> 
    </bean> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource"> 
      <ref bean="dataSource" /> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop>    
      </props> 
     </property> 
     <property name="packagesToScan" value="org.ngo.abhishek.entity"></property> 
    </bean> 

    <!-- Transaction --> 
    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager" /> 
</beans> 

Контроллер REST:

@RestController 
@RequestMapping("/abhishek") 
public class AbhishekController { 

    @Autowired 
    private AbhisheskService abhishekService; 

    @RequestMapping(method=RequestMethod.POST,consumes="application/json") 
    @Secured("ROLE_USER") 
    public ResponseEntity<Boolean> getUserById(@RequestBody List<AbhishekDTO> abhishekDtoList) { 

     boolean flag = this.abhishekService.createAbhishek(abhishekDtoList);  
     return new ResponseEntity<Boolean>(flag, HttpStatus.OK);  
    } 

} 

ответ

1

После получения подсказки от Stiletto я удалил @Secured("ROLE_USER") и использовал проверку безопасности на основе выражений. Он работал (используя перехват url). Поэтому проблема заключалась в том, где размещен @Secured.

С @Secured был в контексте сервлетов диспетчера (детальный контекст по философии весны) и весенняя область безопасности была в applicationContext (родительский контекст), весенняя безопасность игнорировалась.

Ввод <security:global-method-security secured-annotations="enabled"/> в mvc-dispatcher-servlet.xml разрешил проблему.

Похожий вопрос на SO: Spring MVC, Method level security

1

Я попробовал вашу установку, и она работала для меня. Поскольку вы не предоставили весь свой код, я бы предпочел либо проверку компонентов вашего контроллера для Spring Security, либо не происходит, или ваш браузер кэширует и отправляет учетные данные Basic Auth без вашего понимания.

+0

Спасибо за ответ. Я проверю эти две вещи – Atul

Смежные вопросы