文档章节

Spring Boot中使用Spring Security进行安全控制

o
 osc_4nmshwhm
发布于 2018/08/07 09:48
字数 1190
阅读 18
收藏 0

精选30+云产品,助力企业轻松上云!>>>

我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面。要实现访问控制的方法多种多样,可以通过Aop、拦截器实现,也可以通过框架实现(如:Apache Shiro、Spring Security)。

本文将具体介绍在Spring Boot中如何使用Spring Security进行安全控制。

准备工作

首先,构建一个简单的Web工程,以用于后续添加安全控制,也可以用之前Chapter3-1-2做为基础工程。若对如何使用Spring Boot构建Web应用,可以先阅读《Spring Boot开发Web应用》一文。

Web层实现请求映射

@Controller
public class HelloController {

@RequestMapping("/")
public String index() {
return "index";
}

@RequestMapping("/hello")
public String hello() {
return "hello";
}

}
  • /:映射到index.html
  • /hello:映射到hello.html

实现映射的页面

  • src/main/resources/templates/index.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Spring Security入门</title>
</head>
<body>
<h1>欢迎使用Spring Security!</h1>
<p>点击 <a th:href="@{/hello}">这里</a> 打个招呼吧</p>
</body>
</html>
  • src/main/resources/templates/hello.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Hello World!</title>
</head>
<body>
<h1>Hello world!</h1>
</body>
</html>

可以看到在index.html中提供到/hello的链接,显然在这里没有任何安全控制,所以点击链接后就可以直接跳转到hello.html页面。

整合Spring Security

在这一节,我们将对/hello页面进行权限控制,必须是授权用户才能访问。当没有权限的用户访问后,跳转到登录页面。

添加依赖

在pom.xml中添加如下配置,引入对Spring Security的依赖。

<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
...
</dependencies>

Spring Security配置

创建Spring Security的配置类WebSecurityConfig,具体如下:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}

}
  • 通过@EnableWebSecurity注解开启Spring Security的功能
  • 继承WebSecurityConfigurerAdapter,并重写它的方法来设置一些web安全的细节
  • configure(HttpSecurity http)方法
    • 通过authorizeRequests()定义哪些URL需要被保护、哪些不需要被保护。例如以上代码指定了//home不需要任何认证就可以访问,其他的路径都必须通过身份验证。
    • 通过formLogin()定义当需要用户登录时候,转到的登录页面。
  • configureGlobal(AuthenticationManagerBuilder auth)方法,在内存中创建了一个用户,该用户的名称为user,密码为password,用户角色为USER。

新增登录请求与页面

在完成了Spring Security配置之后,我们还缺少登录的相关内容。

HelloController中新增/login请求映射至login.html

@Controller
public class HelloController {

// 省略之前的内容...

@RequestMapping("/login")
public String login() {
return "login";
}

}

新增登录页面:src/main/resources/templates/login.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Spring Security Example </title>
</head>
<body>
<div th:if="${param.error}">
用户名或密码错
</div>
<div th:if="${param.logout}">
您已注销成功
</div>
<form th:action="@{/login}" method="post">
<div><label> 用户名 : <input type="text" name="username"/> </label></div>
<div><label> 密 码 : <input type="password" name="password"/> </label></div>
<div><input type="submit" value="登录"/></div>
</form>
</body>
</html>

可以看到,实现了一个简单的通过用户名和密码提交到/login的登录方式。

根据配置,Spring Security提供了一个过滤器来拦截请求并验证用户身份。如果用户身份认证失败,页面就重定向到/login?error,并且页面中会展现相应的错误信息。若用户想要注销登录,可以通过访问/login?logout请求,在完成注销之后,页面展现相应的成功消息。

到这里,我们启用应用,并访问http://localhost:8080/,可以正常访问。但是访问http://localhost:8080/hello的时候被重定向到了http://localhost:8080/login页面,因为没有登录,用户没有访问权限,通过输入用户名user和密码password进行登录后,跳转到了Hello World页面,再也通过访问http://localhost:8080/login?logout,就可以完成注销操作。

为了让整个过程更完成,我们可以修改hello.html,让它输出一些内容,并提供“注销”的链接。


<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Hello World!</title>
</head>
<body>
<h1 th:inline="text">Hello [[${#httpServletRequest.remoteUser}]]!</h1>
<form th:action="@{/logout}" method="post">
<input type="submit" value="注销"/>
</form>
</body>
</html>

本文通过一个最简单的示例完成了对Web应用的安全控制,Spring Security提供的功能还远不止于此,更多Spring Security的使用可参见Spring Security Reference

完整示例:Chapter4-3-1

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
SpringBoot入门 (十四) Security安全控制

本文记录在SpringBoot使用SpringSecurity进行安全访问控制。 一 什么是Security   Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提...

osc_1h425qie
2019/02/21
5
0
SpringSecurity的简单使用

导入SpringSecurity坐标 在web.xml中配置过滤器 编写spring-securiy配置文件 编写自定义认证提供者 用户新增时加密密码 配置页面的login和logout 获取登录用户的信息 一.SpringSecurity简介 ...

osc_hzy90uit
2019/06/09
7
0
SpringSecurity在Springboot下使用的初步体验

  SpringSecurity曾经在十年前非常火热,只要是做权限系统,当时几乎非用它不可,记得是在XML文件里一堆的配置。曾几何时,Shiro冒了出来,以其简洁和轻量的风格慢慢地捕获了众多码农的心,...

osc_1zw3bob0
2019/04/23
21
0
Spring Security教程(大纲)----学习过程分享

今天给大家分享一下我学习SpringSecurity的过程,及我随后要讲的Spring Security的学习大纲。一为指导想学习SpringSecurity的同学,二为留着自己备用,以便忘了的时候翻出来看看。第一次写博...

jaune161
2019/02/28
4
0
数据后台管理(四)权限控制

当我们在管理后台数据的时候需要对管理者的身份进行认证和授权,在该项目中用到的安全认证服务框架是Spring Security。 1.Spring Security的简单入门 通过一个spring security的入门案例来了...

osc_je020lv0
2019/11/03
8
0

没有更多内容

加载失败,请刷新页面

加载更多

从GitHub删除分支的仓库 - Delete forked repo from GitHub

问题: I'm starting with git and GitHub and there's a project I'm watching on GitHub. 我先从git和GitHub开始,然后在GitHub上观看一个项目。 I unintentionally clicked to fork it. ......

javail
34分钟前
8
0
南极科考——气象专属福利

第一篇文章 与南极有关 在南极 中国第 36 次南极考察,我在雪龙 2 号上全程随船保障,历时半年环绕南极一圈,因此有了上面的那段视频。 学气象出身,但从来没想过会因此去往南极,这次应该就...

curiousmet
06/22
0
0
​Jenkins 基础设施:统计、更新、AWS 赞助

聊聊 Jenkins 统计、更新、AWS和赞助的那些事儿,认识不一样的 Jenkins Jenkins 项目在很大程度上依赖于其基础架构。我们使用诸如 www.jenkins.io 和 plugins.jenkins.io 之类的网站,诸如 ...

Jenkins中文社区
今天
11
0
场景创新,标准共建—联盟智能家居工作组首次研讨会成功召开

2020年7月9日,软件绿色联盟泛终端行业应用组智能家居工作组首次研讨会议成功举办。来自泰尔、腾讯、阿里、360、京东、移动、电信、美的、海尔、松下、长虹、TCL、海雀、国创、海思等企业30多...

软件绿色联盟
前天
13
0
从“人肉扩缩容”到云原生容量,90 后程序员的进化

很难想象,1992年出生的郑洋飞已经是云原生性能容量团队 Leader、2018年双十一稳定性总负责人,2020年双11的副队长。连续6年双十一,不仅是他带领团队的练兵场,更能从中看到蚂蚁集团技术演进...

SOFAStack
前天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部