Spring Boot + Spring安全示例
在本教程中,我们将看到如何创建Spring Boot + Spring Security示例。
让我们看看Spring的启动如何越来越简单。
我将在Spring Boot Hello World示例上应用Spring Security。
Spring Boot + Spring安全示例:
以下是创建Spring Boot + Spring示例的步骤。
用于创建以下项目的工具:
- Spring boot 1.5.3.Release.
- Spring4.3.8.Release.
- Tomcat Embed 8
- Maven 3
- Java 8
- Eclipse
第1步:使用名为"springbootspringsecurityexample"的Eclipse中的Maven创建动态Web项目。
maven依赖项:
第2步:更改POM.xml如下所示:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.igi.theitroad</groupId> <artifactId>SpringBootSpringSecurityExample</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>SpringBootSpringSecurityExample Maven Webapp</name> <url>http://maven.apache.org</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- tag::security[] --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!-- JSTL for JSP --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <!-- For JSP compilation --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>SpringBootSpringSecurityExample</finalName> </build> </project>
Spring-Boot-Starter-Parent为我们提供任何Spring项目所需的所有Maven默认值。
由于我们正在开发一个Web应用程序,我们还需要添加Spring启动启动器 - 启动Web依赖项,并且我们还需要将Spring-Boot-Starter-Security indication来保护此Web应用程序如果我们注意,我们没有提供任何版本具体组件。
我们只需要提供版本号。
(1.5.3.Release)用于春令生。
第3步:创建名为"org.igi.theitroad.springboot"的包创建一个名为"helloworldcontroller.java"的控制器类
package org.igi.theitroad.springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class HelloWorldController { @RequestMapping("/helloworld") public ModelAndView hello() { String helloWorldMessage = "Hello world from theitroad!"; return new ModelAndView("hello", "message", helloWorldMessage); } }
由于请求首先转到DispatcherServlet并将其重定向到控制器类。
这里@controller描绘了这是我们的控制器类。
@RequestMapper用于将传入的HTTP请求映射到Handler方法(Hello()中的控制器中的Hello()).so hellorldcontroller.java的方法将处理来自Dispatcher.so的Get请求。
当我们访问下面URL时
http://localhost:8080/helloworld or http://localhost:8080/helloworld.html
上面的方法将被调用。
第4步:在包org.igi.theitroad中创建名为"webseecurityconfiguaration.java"的文件
package org.igi.theitroad; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; @Configuration @EnableWebSecurity public class WebSecurityConfiguaration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/hello*").access("hasRole('ROLE_ADMIN')").and().formLogin();; } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("theitroad").password("java123").roles("ADMIN"); } }
@EnableWebSecurity批注用于为此webapp启用Spring Security。
authroizeRequest()。
AddMatchers()方法用于配置Patternute for Request.for示例:如果HTTP请求URL具有模式/hello*(hello.jsp,helloworld.html),它将仅访问Role_Admin。
我们使用InmeMoryAuthEntication()具有硬编码用户名(onAtroad)和密码(java123),因此,如果用户为管理员提供正确的凭据,那么只有他将能够访问HelloWorld.html。
第4步:创建名为"org.igi.theitroad"的包创建一个名为"springboothellyorldapplication.java"的类。
package org.igi.theitroad; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringBootHelloWorldApplication { public static void main(String[] args) { SpringApplication.run(SpringBootHelloWorldApplication.class, args); } }
我们刚刚添加了@springbootapplication,它做了所有的工作。
让我们了解更多关于这个注释的信息。
@springBootApplication是添加以下所有内容的注释:
@configuration使类作为应用程序上下文的Bean定义的源。
@EnableAutoConfiguration允许Spring Boot在ClassPath设置和各种属性设置中添加Bean礼物。
通常,我们将为Spring MVC应用程序添加@bableWebMVC,但Spring Boot会在类路径上看到Spring-WebMVC时自动添加它。
将应用程序标记为Web应用程序,并激活诸如设置DispatcherServlet之类的关键行为。
@ComponentsCan告诉Spring在默认包中查找其他组件,配置和服务,允许它找到控制器。
如果未定义特定包,则会从声明此注释的类的包中扫描。
步骤5:创建名为Application.properties的属性文件,如下所示,并将其放在SRC/Main/Resours中。
spring.mvc.view.prefix:/web-inf/spring.mvc.view.suffix:.jsp
在Spring MVC示例中,在SpringMVC-Dispatcher-servlet.xml中使用的两个属性非常相似。
步骤7:修改index.jsp如下所示:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>HelloWorld</title> </head> <body> <a href="helloworld.html">Click here to read hello message </a> </br> <a href="<c:url value="/logout" ">Logout</a> </body> </html>
第7步:在/web-inf /文件夹中创建hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello</title> </head> <body> ${message} </body> </html>
这完全是关于Spring的启动你好世界例。
第8步:这是时候做Maven Build。
右键单击项目 - >运行AS - > Maven Build
步骤9:提供目标作为清洁安装Spring 引导:运行(如下所示)并单击"运行"
我们将在Console中看到以下输出。
请注意,我在此处截断输出:
2016-05-06 01:02:53.086 INFO 16095 — [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2016-05-06 01:02:53.086 INFO 16095 — [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 8060 ms 2016-05-06 01:02:53.773 INFO 16095 — [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 2016-05-06 01:02:53.774 INFO 16095 — [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2016-05-06 01:02:53.774 INFO 16095 — [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*] 2016-05-06 01:02:53.774 INFO 16095 — [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 2016-05-06 01:02:53.776 INFO 16095 — [ost-startStop-1] .s.DelegatingFilterProxyRegistrationBean : Mapping filter: 'springSecurityFilterChain' to: [/*] 2016-05-06 01:02:53.776 INFO 16095 — [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/] 2016-05-06 01:02:54.699 INFO 16095 — [ main] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: org.springframework.security.web.util.matcher.AnyRequestMatcher@1, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@16adb5a1, org.springframework.security.web.context.SecurityContextPersistenceFilter@31094dc4, org.springframework.security.web.header.HeaderWriterFilter@496c7d01, org.springframework.security.web.csrf.CsrfFilter@3005d2e1, org.springframework.security.web.authentication.logout.LogoutFilter@2d7ecd73, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@6c308887, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@514797af, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@14a08616, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@3f373a85, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@41b1e420, org.springframework.security.web.session.SessionManagementFilter@61184671, org.springframework.security.web.access.ExceptionTranslationFilter@4716657, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@216679a4] 2016-05-06 01:02:54.846 INFO 16095 — [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6d29ef13: startup date [Sat Jan 06 01:02:45 IST 2016]; root of context hierarchy 2016-05-06 01:02:54.988 INFO 16095 — [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped “{[/helloworld]}" onto public org.springframework.web.servlet.ModelAndView org.igi.theitroad.springboot.HelloWorldController.hello() 2016-05-06 01:02:54.990 INFO 16095 — [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped “{[/logout],methods=[GET]}" onto public java.lang.String org.igi.theitroad.springboot.HelloWorldController.logoutPage(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 2016-05-06 01:02:54.997 INFO 16095 — [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped “{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 2016-05-06 01:02:54.997 INFO 16095 — [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped “{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 2016-05-06 01:02:55.037 INFO 16095 — [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2016-05-06 01:02:55.038 INFO 16095 — [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2016-05-06 01:02:55.092 INFO 16095 — [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2016-05-06 01:02:55.406 INFO 16095 — [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2016-05-06 01:02:55.627 INFO 16095 — [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 2016-05-06 01:02:55.636 INFO 16095 — [ main] o.a.j.SpringBootHelloWorldApplication : Started SpringBootHelloWorldApplication in 12.511 seconds (JVM running for 34.07)
步骤10:让我们现在测试应用程序。
随着Spring使用嵌入式Tomcat,我们可以使用http://localhost:8080/index.jsp访问项目。
单击"点击此处阅读Hello消息"链接时,我们将得到以下屏幕。
如果我们放置正确的用户和密码,我们将看到以下屏幕。
如果我们放置了不正确的用户或者密码,然后单击"登录"。