在學(xué)習(xí)spring secuity之前我們先構(gòu)建一個(gè)spring mvc的web程序裁着,以后的spring secuity就在這個(gè)web程序基礎(chǔ)上去構(gòu)建捂掰。
- 加入依賴
我們使用maven構(gòu)建項(xiàng)目梆砸,我們加入了springmvc
和servlet
相關(guān)的依賴,并且加入了jetty插件,可以不使用外部容器的情況下去運(yùn)行啟動(dòng)項(xiàng)目峦朗,依賴如下:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>springmvc-web</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.3.v20170317</version>
<configuration>
<httpConnector>
<port>8001</port>
</httpConnector>
//配置contextPath為/
<webApp>
<contextPath>/</contextPath>
</webApp>
</configuration>
</plugin>
</plugins>
</build>
- 首先定義系統(tǒng)啟動(dòng)根類
配置的@EnableWebMvc注解的類需要繼承WebMvcConfigurerAdapter
禁偎,來做一下回調(diào)配置(比如說自己定義的類型轉(zhuǎn)換器腿堤,自己定義的攔截器等),詳細(xì)了解可以點(diǎn)擊查看@EnableWebMvc
的源碼備注
@EnableWebMvc
@ComponentScan("com.zhihao.miao.mvc")
public class WebAppConfig extends WebMvcConfigurerAdapter {
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
//配置默認(rèn)的DefaultServletHttpRequestHandler(靜態(tài)資源默認(rèn)使用的servlet)如暖,DefaultServletHttpRequestHandler是HttpRequestHandler的默認(rèn)實(shí)現(xiàn)笆檀,
configurer.enable();
}
}
- 其他的一些配置
/**
* 系統(tǒng)啟動(dòng)類,配置url過濾的url
*/
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
//以我的理解就是以WebAppConfig來創(chuàng)建spring 容器上下文
return new Class<?>[]{WebAppConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[]{"/*"};
}
}
- 定義自己的Controller
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello spring mvc web";
}
@GetMapping("/home")
public String home(){
return "home spring mvc web";
}
@GetMapping("/admin")
public String admin(){
return "admin spring mvc web";
}
}
- 測(cè)試
訪問下面三個(gè)接口盒至,都可以訪問酗洒,
http://localhost:8001/hello
http://localhost:8001/home
http://localhost:8001/admin
- url的組成
這邊說明一下url地址的一些組成,比如說http://127.0.0.1:8081/home
枷遂,其可以看成http[s]://[host]:[port][request url][?queryString]
樱衷,而request url = [context path][servlet path][path info]
,url路徑除了context path
和servlet path
之外就是path_info
了酒唉,我們這邊沒有配置context path
和servlet path
矩桂。
修改一下Controller,
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(HttpServletRequest req){
System.out.println("==================");
System.out.println(" req.getRequestURI(): " + req.getRequestURI());
System.out.println(" req.getContextPath(): " + req.getContextPath());
System.out.println(" req.getServletPath(): " + req.getServletPath());
System.out.println(" req.getPathInfo(): " + req.getPathInfo());
System.out.println("==================");
return "hello spring mvc web";
}
@GetMapping("/home")
public String home(){
return "home spring mvc web";
}
@GetMapping("/admin")
public String admin(){
return "admin spring mvc web";
}
}
控制臺(tái)打踊韭住:
==================
req.getRequestURI(): /hello
req.getContextPath():
req.getServletPath():
req.getPathInfo(): /hello
==================
- 我們修改pom文件的jetty插件的
context path
如下侄榴,
<build>
<finalName>springmvc-web</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.3.v20170317</version>
<configuration>
<httpConnector>
<port>8001</port>
</httpConnector>
<webApp>
<!--修改contextPath>
<contextPath>/web</contextPath>
</webApp>
</configuration>
</plugin>
</plugins>
</build>
此時(shí)訪問的url地址就改成了:
http://localhost:8001/web/hello
控制臺(tái)打印:
==================
req.getRequestURI(): /web/hello
req.getContextPath(): /web
req.getServletPath():
req.getPathInfo(): /hello
==================
- 我們?cè)偃バ薷?code>servlet path流妻,修改配置類中
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
//以我的理解就是以WebAppConfig來創(chuàng)建spring 容器上下文
return new Class<?>[]{WebAppConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
/**
* url mapping 通常有三種配置方式
*
* 1: /*
* 2: /aaa/*, /aaa/bbb/*
* 3: *.do, *.action
*
* 第一種配置方式 servlet Path 為空
* 第二種配置方式 servlet Path /aaa, /aaa/bbb/
* 第三種配置方式servlet Path /aaa/bbb.do, /aaa/bbb.action
*
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/v1/*","/v2/*"};
}
}
此時(shí)訪問路徑:
http://localhost:8001/web/v1/hello
控制臺(tái)打由瘛:
==================
req.getRequestURI(): /web/v1/hello
req.getContextPath(): /web
req.getServletPath(): /v1
req.getPathInfo(): /hello
==================
或者:
http://localhost:8001/web/v2/hello
控制臺(tái)打印:
==================
req.getRequestURI(): /web/v2/hello
req.getContextPath(): /web
req.getServletPath(): /v2
req.getPathInfo(): /hello
==================
講到這邊一個(gè)基于spring web構(gòu)建的web程序已經(jīng)搭建成功绅这,并且可以進(jìn)行訪問了涣达,我們發(fā)現(xiàn)我們應(yīng)用暴露的url地址不管是誰都可以訪問,這樣是不安全的证薇,我們希望其得到一些權(quán)限認(rèn)證度苔,不同的人員認(rèn)證之后才可以訪問具體的資源。而spring secuity就是為了解決這個(gè)問題的浑度,當(dāng)然spring secuity框架能為我們做的事情不僅如此寇窑。
Spring Security
Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications.
Spring Security是一個(gè)強(qiáng)大的且高度可定制化的身份認(rèn)證和訪問控制框架。是一個(gè)基于Spring之上的一個(gè)提供安全解決方案的框架
- 特征
- 多種認(rèn)證方式HTTP BASIC箩张,HTTP Digest(HTTP摘要認(rèn)證)甩骏,X.509窗市,LDAP。Form-based(HTTP表單認(rèn)證)饮笛,OpenID咨察,CAS
- 多種權(quán)限驗(yàn)證,支持基于URL的權(quán)限驗(yàn)證福青,方法的權(quán)限驗(yàn)證等
- 多種安全領(lǐng)域的解決方案摄狱,XSS,XSRF无午,CORS媒役,session管理,單點(diǎn)登錄(CAS)宪迟,OAuth等等酣衷。
- 強(qiáng)大的可擴(kuò)展性,可配置性
- 基于官方Java Config(注解)和xml的配置方式
- 官方集成springboot次泽,大大簡(jiǎn)化了spring security的開發(fā)難度鸥诽。