Статьи

Как настроить базовую аутентификацию с помощью веб-служб Spring

Это очень простой пример использования Spring MVC, REST, Spring Test Framework, Spring и Spring Security с конфигурацией Spring в Java.

Первая часть этого заключается в создании класса конфигурации для веб-приложения. Ниже приведен пример класса конфигурации, который мы будем использовать:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.johnathanmsmith.mvc.web"})
@ImportResource("/WEB-INF/spring/applicationContext.xml")
public class WebMVCConfig extends WebMvcConfigurerAdapter
{

    private static final Logger logger = LoggerFactory.getLogger(WebMVCConfig.class);

    @Bean
    public ViewResolver resolver()
    {
        UrlBasedViewResolver url = new UrlBasedViewResolver();
        url.setPrefix("/views/");
        url.setViewClass(JstlView.class);
        url.setSuffix(".jsp");
        return url;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry)
    {
        logger.debug("setting up resource handlers");
        registry.addResourceHandler("/resources/").addResourceLocations("/resources/**");
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
    {
        logger.debug("configureDefaultServletHandling");
        configurer.enable();
    }

    @Bean
    public SimpleMappingExceptionResolver simpleMappingExceptionResolver()
    {
        SimpleMappingExceptionResolver b = new SimpleMappingExceptionResolver();

        Properties mappings = new Properties();
        mappings.put("org.springframework.web.servlet.PageNotFound", "p404");
        mappings.put("org.springframework.dao.DataAccessException", "dataAccessFailure");
        mappings.put("org.springframework.transaction.TransactionException", "dataAccessFailure");
        b.setExceptionMappings(mappings);
        return b;
    }
}

Затем вы должны настроить файл web.xml для использования вышеуказанного класса конфигурации. Мы делаем это, устанавливая contectConfigLocation в пакет класса конфигурации.

Мы также настроили цепочку фильтра безопасности Spring, указывающую на файл applicationContext.xml, который указывает на my-security.xml.

Ниже приведен код web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
    <servlet>
        <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>com.johnathanmsmith.mvc.web.config</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Spring MVC Dispatcher Servlet</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>
    </filter-mapping>

    <context-param>
        <description>The Spring configuration files.</description>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/applicationContext.xml</param-value>
    </context-param>

    <listener>
        <description>The Spring context listener.</description>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

</web-app>

Now you can see that we have setup BASIC authentication in the my-security.xml file using Spring security.

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                        http://www.springframework.org/schema/security
                        http://www.springframework.org/schema/security/spring-security-3.1.xsd">
    <global-method-security pre-post-annotations="enabled"/>

    <http use-expressions="true">
        <intercept-url access="hasRole('ROLE_VERIFIED')" pattern="/json/*"/>
        <intercept-url pattern='/*' access='permitAll'/>

        <logout logout-success-url="/"/>

        <session-management session-fixation-protection="newSession">
            <concurrency-control max-sessions="1"/>
        </session-management>

        <http-basic />
    </http>
    <authentication-manager>
        <authentication-provider>
            <user-service>
                <user name="test" password="test" authorities="ROLE_VERIFIED"/>
            </user-service>

        </authentication-provider>
    </authentication-manager>
</beans:beans>

Теперь давайте настроим базовый контроллер JSON для отправки данных JSON клиенту:

@Controller
@RequestMapping("/json")
class JSonController
{

    private static final Logger logger = LoggerFactory.getLogger(JSonController.class);

    private MappingJacksonJsonView  jsonView = new MappingJacksonJsonView();
    @RequestMapping(value = "/{name}", method = RequestMethod.GET)
    @ResponseBody
    public User getName(@PathVariable String name, ModelMap model) throws ResourceNotFoundException
    {

        logger.debug("I am in the controller and got user name: " + name);

        /*

            Simulate a successful lookup for 2 users, this is where your real lookup code would go

         */

        if ("JohnathanMarkSmith".equals(name))
        {
            return new User("Johnathan Mark Smith", name);
        }

        if ("Regan".equals(name))
        {
            return new User("Regan Smith", name);
        }

        throw new ResourceNotFoundException("User Is Not Found");
    }

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ResponseEntity<User> getDisplayDefault(ModelMap model)
    {
        return new ResponseEntity<User>(new User("Johnathan Mark Smith", "JohnathanMarkSmith"), HttpStatus.OK);
    }
    @ExceptionHandler
    public ResponseEntity<ErrorHolder> handle(ResourceNotFoundException e) {
        logger.warn("The resource was not found", e);
        return new ResponseEntity<ErrorHolder>(new ErrorHolder("Uh oh"), HttpStatus.NOT_FOUND);
    }
    class ErrorHolder {
        public String errorMessage;
        @JsonCreator
        public ErrorHolder(@JsonProperty("errorMessage") String errorMessage)
        {
            this.errorMessage = errorMessage;
        }

    }
}

Это все, что нужно …

Получение проекта и запуск его

Чтобы получить этот проект и запустить его, вам нужно будет выполнить следующие шаги:

Клонировать его с помощью git:

git clone  git@github.com:JohnathanMarkSmith/springmvc-rest-secured-test.git
cd springmvc-rest-secured-test/
mvn tomcat7:run

Теперь откройте ваш веб-браузер и перейдите на http://127.0.0.1:8080/springmvc-rest-secured-test/

Вот и все. Это работает!

Если у вас есть какие-либо вопросы или комментарии, пожалуйста, напишите мне по адресу john@johnathanmarksmith.com или посетите мой веб-сайт http://JohnathanMarkSmith.com