Spring Security:简单的保护一个SpringBoot应用程序(总结)
Spring Security 在 Java类中的配置
在 Spring Security 中使用 Java配置,可以轻松配置 Spring Security 而无需使用 XML 。
在Spring 3.1中,Java 类配置已添加到了 Spring 框架中,并在Spring 3.2中扩展到了Spring Security,并且定义了 JavaConfig 是带有@Configuration
的类。
Spring Boot Web 应用中使用 Spring Security,添加添加 Spring Boot Security 的依赖,Spring Boot 应用程序将自动要求所有 HTTP 端点都使用基本身份验证。
使用 Maven 添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
基本用法是示例:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.inMemoryAuthentication().withUser("user")
.password("password").roles("USER");
}
}
上面代码可以观察到,该身份验证配置了基于内存的身份验证。
HTTP Security HTTP安全
// 指定任何请求都需要经过身份验证后才能访问URLprotected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()// 可以拥有多个子节点,和antMatcher()来定制URL访问规则
.anyRequest().authenticated()// 指定任何请求都需要经过身份验证后才能访问URL
.and().httpBasic();// 允许用户使用HTTP Basic身份验证进行身份验证
}
上面的默认配置可确保使用基于表单的登录名或HTTP基本身份验证来验证对应用程序的任何请求是否合法。
它与以下 XML 配置完全相似:
<http>
<intercept-url pattern="/**" access="authenticated"/>
<form-login />
<http-basic />
</http>
题外话——HTTP基本认证的优缺点
在HTTP中,基本认证(英语:Basic access authentication)是允许http用户代理(如:网页浏览器)在请求时,提供 用户名 和 密码 的一种方式。
在进行基本认证的过程里,请求的HTTP头字段会包含Authorization字段,形式如下: Authorization: Basic <凭证>,该凭证是用户和密码的组和的base64编码。
优点:
HTTP基本认证 是一种十分简单的技术,使用的是 HTTP头部字段 强制用户访问网络资源,而不是通过必要的 cookie、会话ID、登录页面等(非获取访问控制的)手段。
基本上所有流行的网页浏览器都支持基本认证。基本认证很少在可公开访问的互联网网站上使用,有时候会在小型私有系统中使用(如路由器网页管理接口)。之后诞生的 HTTP摘要认证 用于替代基本认证,允许密钥以相对安全的方式在不安全的通道上传输。
程序员和系统管理员有时会在可信网络环境中使用基本认证。由于,基本认证使用的是Base64,可解码成明文,因此使用Telnet等网络协议工具进行监视时,可以直接获取内容,并用于诊断。
缺点:
基本认证 并没有为传送凭证(英语:transmitted credentials)提供任何机密性的保护。仅仅使用 Base64 编码并传输,而没有使用任何 加密 或 散列算法。因此,基本认证常常和 HTTPS 一起使用,以提供机密性。
现存的浏览器保存认证信息直到标签页或浏览器被关闭,或者用户清除历史记录。HTTP没有为服务器提供一种方法指示客户端丢弃这些被缓存的密钥。这意味着服务器端在用户不关闭浏览器的情况下,并没有一种有效的方法来让用户退出。
同时 HTTP 并没有提供退出机制。但是,在一些浏览器上,存在清除凭证(credentials )缓存的方法。
FormLogin 表单登录 和 Authorization With Roles 角色授权
Spring Security 基于已启用的功能并使用处理提交的登录名的 URL 的标准值自动生成一个登录页面:
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests() // 可以拥有多个子节点,和antMatcher()来定制URL访问规则
.antMatchers("/login/**").permitAll()// 允许所有人匿名访问"/login*"登录页面; ant-style path patterns ANT样式路劲匹配器 有 *,**,? 这三种通配符
.antMatchers("/admin/**").hasRole("ADMIN") // "/admin/"路径下的URL只允许ROLE_ADMIN角色才能访问
.anyRequest().authenticated() // 指定任何请求都需要经过身份验证后才能访问URL
.and().formLogin()// 允许用户使用基于表单的登录进行身份验证
.loginPage("/login").permitAll();// 指定登录页路径并允许所有角色访问
}
在这里,自动生成的登录页面便于快速启动和运行。还有如何通过访问使用类型安全的API(hasRole)以及基于表达式的 API。请注意,antMatchers() 元素的顺序很重要,需要首先制定更具体的规则,然后是更通用的规则。
几种方法可以用来配置表单登录.formLogin()
的行为:
loginPage() – 自定义登录页面
loginProcessingUrl() –将用户名和密码提交到的URL
defaultSuccessUrl() -成功登录后的登录页面
failureUrl() –登录失败后的登录页面
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.loginPage("/login.html")
.loginProcessingUrl("/perform_login")
.defaultSuccessUrl("/homepage.html",true)
.failureUrl("/login.html?error=true")
}
Logout 登出
与 Spring Security 的许多其他方面一样,框架有提供默认的出色的注销功能。默认情况下,注销请求会使会话无效,清除所有身份验证缓存,清除 SecurityContextHolder 并重定向到登录页面。
protected void configure(HttpSecurity http) throws Exception {
http.logout();
}
但是,如果你想进一步地控制可靠的处理程序,可以看下面这段更完整的实现:
protected void configure(HttpSecurity http) throws Exception {
http.logout().logoutUrl("/my/logout")
.logoutSuccessUrl("/my/index")
.logoutSuccessHandler(logoutSuccessHandler) // 注销成功handler
.invalidateHttpSession(true)// 控制会话无效
.addLogoutHandler(logoutHandler)// 注销失败handler
.deleteCookies(cookieNamesToClear)// 用户注销时要删除的cookie列表
.and()
// some other method calls
}
Spring Security 的一些认证方式
基于内存的认证
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password("password").roles("USER")
.and()
.withUser("admin").password("password").roles("USER", "ADMIN");
}
JDBC验证,需要在应用程序中定义一个数据源
@Autowired
private DataSource dataSource;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.jdbcAuthentication().dataSource(dataSource)
.withDefaultSchema() // 默认用户Schema
.withUser("user").password("password").roles("USER")
.and()
.withUser("admin").password("password").roles("USER", "ALADMIN");
}
关于用户Schema,UserDetailsService
(JdbcDaoImpl
)的标准JDBC实现要求表为用户加载密码,帐户状态(启用或禁用)和权限列表(角色)。你将需要调整此架构以匹配你在正在使用的数据库方言或驱动(将某个应用程序与某个数据库管理系统连接)。(参考1)
create table users(
username varchar_ignorecase(50) not null primary key,
password varchar_ignorecase(50) not null,
enabled boolean not null
);
create table authorities (
username varchar_ignorecase(50) not null,
authority varchar_ignorecase(50) not null,
constraint fk_authorities_users foreign key(username) references users(username)
);
create unique index ix_auth_username on authorities (username,authority);
题外话——在MySQL中,Schema与Database是同义词。你可以用MySQL SQL语法SCHEMA
代替关键字DATABASE
,例如使用CREATE SCHEMA
代替CREATE DATABASE
。其他一些数据库产品也有区别。例如,在Oracle数据库产品中,Schema仅代表Database的一部分:单个用户拥有的表和其他对象。你可以在MySQL数据库下验证一下:
CREATE SCHEMA `test_schema`;
CREATE DATABASE `test_database`;
然后你会发现这两者在物理上是一样的效果,可以用 MySQL SQL 语法SCHEMA
代替关键字DATABASE
,例如使用CREATE SCHEMA
代替CREATE DATABASE
都创建了一个数据库。不同的RDBMS中,Schema和Database不一定是一样的概念。关于MySQL中对这更详细的描述,请参考这里。
注意一点,withDefaultSchema指令提供的DDL脚本使用了不适合MySQL的方言,项目启动时会报嵌套的java.sql.SQLSyntaxErrorException
异常。(参考2)
解决方案:(不使用withDefaultSchema )
auth.jdbcAuthentication()
.dataSource(dataSource)
.usersByUsernameQuery(
"select username,password, enabled from users where username=?")
.authoritiesByUsernameQuery(
"select username, role from user_roles where username=?");
使用LDAP(Lightweight Directory Access Protocol,轻量级目录访问协议)验证用户(参考3)
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.ldapAuthentication()
.userDnPatterns("uid={0},ou=people")
.groupSearchBase("ou=groups")
.contextSource()
.url("ldap://localhost:8389/dc=springframework,dc=org")
.and()
.passwordCompare()
.passwordEncoder(new BCryptPasswordEncoder())
.passwordAttribute("userPassword");
}
这个协议它是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。目录服务在开发内部网和与互联网程序共享用户、系统、网络、服务和应用的过程中占据了重要地位。
LDAP的一个常用用途是单点登录,用户可以在多个服务中使用同一个密码,通常用于公司内部网站的登录中(这样他们可以在公司电脑上登录一次,便可以自动在公司内部网上登录)。(LDAP实践参考)
Spring Security:简单的保护一个SpringBoot应用程序(总结)的更多相关文章
- spring security 简单入门
spring security 简单入门示例 一.概述 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架 . 其中最主要的安全操作有两 ...
- Spring Security(五) —— 动手实现一个 IP_Login
摘要: 原创出处 https://www.cnkirito.moe/spring-security-5/ 「老徐」欢迎转载,保留摘要,谢谢! 5 动手实现一个IP_Login 在开始这篇文章之前,我们 ...
- spring security关闭http验证 和 springboot 使用h2数据库
spring security关闭http验证 最近在跑demo的过程中,访问swagger页面的时候需要验证登录,记得在之前写的代码中是关闭了security验证,无需登录成功访问,直接在appli ...
- spring security简单教程以及实现完全前后端分离
spring security是spring家族的一个安全框架,入门简单.对比shiro,它自带登录页面,自动完成登录操作.权限过滤时支持http方法过滤. 在新手入门使用时,只需要简单的配置,即可实 ...
- spring security简单登录的认证
一.思路 1.先导入相关配置(使用spring security校验之后,登录拦截的配置) 2.创建一个 WebSecurityConfig 继承 WebSecurityConfigurerAdapt ...
- Spring Security 一键接入验证码登录和小程序登录
最近实现了一个多端登录的Spring Security组件,用起来非常丝滑,开箱即用,可插拔,而且灵活性非常强.我觉得能满足大部分场景的需要.目前完成了手机号验证码和微信小程序两种自定义登录,加上默认 ...
- spring security 简单应用
Pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:// ...
- 到spring官网创建第一个springboot工程
登录到spring的官网,直接生成一个,然后倒入本地工程就可以了. https://start.spring.io/ 点击创建的时候. 就等于下载了这个工程. 下载后,倒入到我们的maven工程可以直 ...
- 仅显示sessionid,servername,serverport的一个springboot小程序
下载地址:https://files.cnblogs.com/files/xiandedanteng/sessionid20191227-1.zip --END-- 2019-12-2710:07
随机推荐
- ourphp 最新版(v1.7.3) 后台sql注入
version:<?php /******************************************************************************* * ...
- CPF 入门教程 - 各平台各系统发布说明(九)
CPF C#跨平台桌面UI框架,支持Windows,Mac,Linux,支持龙芯.飞腾等CPU 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - ...
- (3)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-Spring Cloud和Dubbo的区别及各自的优缺点
我们先从 Nginx 说起,了解为什么需要微服务.最初的服务化解决方案是给相同服务提供一个统一的域名,然后服务调用者向这个域发送 HTTP 请求,由 Nginx 负责请求的分发和跳转. 这种架构存 ...
- Centos下Yum安装PHP7.0
默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 1.检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们 ...
- 什么是maven与maven的使用过程(例如在idea创建maven工程(重点讲讲idea创建使用maven管理的web工程,并且部署到tomcat上))
什么是maven与maven的使用过程(例如在idea创建maven工程) (重点讲讲idea创建使用maven管理的web工程项目,并且部署到tomcat服务器上) 一.什么是maven? 1, M ...
- Eclipse中快速生成Javabean的方法
总结一下: 先写出属性 无参构造器:Alt+/ 再按回车 全参构造器:Alt+Shift+S 再按字母O键 再按回车 toString方法:Alt+Shift+S 再按字母S键 再按回车 get/se ...
- 用java代码遍历excel文件并回显
今天需要完成282个指标,分析后发现好多都是可复用的字段和方法,生成的dao类也是很多重复的代码,所以写下了简单的自动化遍历excel的test方法, excel业务逻辑如下,用了 HSSFSheet ...
- php超时报错: Maximum execution time of 300 seconds exceeded
php.ini里max_execution_time = 30,原因是这个脚本执行时间太小了,增加一些,或者改成0不限制 可以增加代码: set_time_limit(0);
- dedecms编辑器不能复制word格式的处理方法
在word文档中编辑一篇文章,格式段落都整理好后,粘贴到dede编辑器里面却发现,格式都无效了,可能dede有自己的打算,比如这样可以文章字体大小统一,样色统一,整体比较整洁.但是用惯了word编辑文 ...
- shell 基本语法介绍
一.介绍 shell 是属于弱类型语言,指的是在定义变量时不需要指定变量的类型,就如python也是弱类型语言.一般以: :.sh结尾的文件 :文件第一行固定为:#!/bin/bash,表示指定以sh ...