关键词:
1.OAuth 2.0简介
OAuth 2.0提供者机制负责公开OAuth 2.0受保护的资源。该配置包括建立可独立或代表用户访问其受保护资源的OAuth 2.0客户端。提供者通过管理和验证用于访问受保护资源的OAuth 2.0令牌来实现。在适用的情况下,提供商还必须提供用户界面,以确认客户端可以被授权访问受保护资源(即确认页面)。
2.OAuth 2.0的四种授权模式
OAuth 2.0常见的有如下四种授权模式,(主要参考自 阮一峰 OAuth 2.0 的四种方式):
- 授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌.
- 隐藏式,有些 Web 应用是纯前端应用,没有后端。这时就不能用上面的方式了,必须将令牌储存在前端。RFC 6749 就规定了第二种方式,允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)"隐藏式"(implicit).
- 密码式,如果你高度信任某个应用,RFC 6749 也允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌,这种方式称为"密码式"(password).
- 凭证式,最后一种方式是凭证式(client credentials),适用于没有前端的命令行应用,即在命令行下请求令牌.
3.使用授权码模式获得JWTtoken令牌Demo项目演示
client_id: demo-client
client_secret: demo-secret (数据表中需要加密)
// 登录页访问地址
http://localhost:8080/login
用户名: admin
密码: 123456
// 资源页访问地址
http://localhost:8081/oauth2-server/login
// 授权访问地址
http://localhost:8080/oauth/authorize?client_id=demo-client&response_type=code&redirect_uri=http://localhost:8081/oauth2-server/login
Html演示页面地址为:http://localhost:8081/oauth2-server/index,授权访问效果如下,授权后会返回相应的token:
4.项目结构以及相关代码配置
项目结构如下:
建表语句:
CREATE TABLE `oauth_client_details` (
`client_id` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`resource_ids` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`client_secret` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`scope` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`authorized_grant_types` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`web_server_redirect_uri` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`authorities` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`access_token_validity` int(11) NULL DEFAULT NULL,
`refresh_token_validity` int(11) NULL DEFAULT NULL,
`additional_information` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`autoapprove` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`client_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `oauth_client_details` VALUES (‘demo-client‘, NULL, ‘$2a$10$jr6DMjq2pRS1pa8vGvgdUewJTLXyHazOIgG5OrotSVhqhTgoCx1m.‘, ‘all‘, ‘authorization_code,refresh_token‘, ‘http://localhost:8081/oauth2-server/login‘, NULL, 3600, 36000, NULL, ‘1‘);
pom依赖:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<!-- ################## Lombok ################## -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
security-web: 用于用户的认证,根据用户的用户名和密码进行认证并用于获得授权码和获取JWT token的服务,主要配置如下:
GetSecret (获取Header以及加密后的密码):
public class GetSecret
private static final String APP_KEY = "demo-client";
private static final String SECRET_KEY = "demo-secret";
public static void main(String[] args)
System.out.println("secret: "+new BCryptPasswordEncoder().encode("demo-secret"));
System.out.println("getHeader: "+getHeader());
/**
* 构造Basic Auth认证头信息
*
* @return
*/
private static String getHeader()
String auth = APP_KEY + ":" + SECRET_KEY;
byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(Charset.forName("US-ASCII")));
String authHeader = "Basic " + new String(encodedAuth);
return authHeader;
WebSecurityConfig
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
@Bean
public PasswordEncoder passwordEncoder()
return new BCryptPasswordEncoder();
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception
return super.authenticationManagerBean();
/**
* 允许匿名访问所有接口 主要是 oauth 接口
* @param http
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception
http.formLogin()
.and()
.authorizeRequests()
.antMatchers("/**").permitAll();
OAuth2Config
@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends AuthorizationServerConfigurerAdapter
@Autowired
@Qualifier("demoUserDetailsService")
public UserDetailsService demoUserDetailsService;
@Autowired
private DataSource dataSource;
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private TokenStore jwtTokenStore;
@Autowired
private JwtAccessTokenConverter jwtAccessTokenConverter;
@Autowired
private TokenEnhancer jwtTokenEnhancer;
@Override
public void configure(final AuthorizationServerEndpointsConfigurer endpoints) throws Exception
/**
* jwt 增强模式
*/
TokenEnhancerChain enhancerChain = new TokenEnhancerChain();
List<TokenEnhancer> enhancerList = new ArrayList<>();
enhancerList.add(jwtTokenEnhancer);
enhancerList.add(jwtAccessTokenConverter);
enhancerChain.setTokenEnhancers(enhancerList);
endpoints.tokenStore(jwtTokenStore)
.userDetailsService(demoUserDetailsService)
/**
* 支持 password 模式
*/
.authenticationManager(authenticationManager)
.tokenEnhancer(enhancerChain)
.accessTokenConverter(jwtAccessTokenConverter);
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception
clients.jdbc(dataSource);
@Override
public void configure(AuthorizationServerSecurityConfigurer security)
security.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()")
.allowFormAuthenticationForClients();
oauth2-server: 主要用于授权认证后的资源访问,使用的是授权码授权模式(这也是最常见的Oauth2.0的模式),主要资源配置如下:
@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ResourceServerConfig extends ResourceServerConfigurerAdapter
@Bean
public TokenStore jwtTokenStore()
return new JwtTokenStore(jwtAccessTokenConverter());
@Bean
public JwtAccessTokenConverter jwtAccessTokenConverter()
JwtAccessTokenConverter accessTokenConverter = new JwtAccessTokenConverter();
accessTokenConverter.setSigningKey("demo");
accessTokenConverter.setVerifierKey("demo");
return accessTokenConverter;
@Autowired
private TokenStore jwtTokenStore;
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception
resources.tokenStore(jwtTokenStore);
@Override
public void configure(HttpSecurity http) throws Exception
http.authorizeRequests().antMatchers("/login").permitAll();
5.GitHub项目地址:
https://github.com/fengcharly/spring-boot-oauth2
单点登录系统使用springsecurity的权限功能(代码片段)
...、授权等都已经完成希望不用用户再次登录,就可以使用SpringSecurity的权限控制SpringSecuritySpringSecurity最主要的两个功能:认证和授权功能解决的问题SpringSecurity中主要类认证(Authenticati 查看详情
使用springsecurity登录认证,通过oauth2.0开发第三方授授权访问资源项目详解(代码片段)
1.OAuth2.0简介OAuth2.0提供者机制负责公开OAuth2.0受保护的资源。该配置包括建立可独立或代表用户访问其受保护资源的OAuth2.0客户端。提供者通过管理和验证用于访问受保护资源的OAuth2.0令牌来实现。在适用的情况下,提供商还必须... 查看详情
springsecurity自定义拦截器filter实现登录认证(代码片段)
...ionId),并记录登录状态(比如token信息的获取);原本打算使用SpringSecurity中OAuth2.0的机制实现用小程序登录,发现小程序再已经获取授权码code登录流程和SpringSecurity中OAuth2.0登录的流程有点不一样,所以直接使用springsecurity的Fil... 查看详情
总结关于springsecurity使用jwt和账户密码登录整合在一起的新感悟
(1)jwt登录拦截,需要在账户密码认证之前进行jwt认证,因此jwt拦截需要在UsernamePasswordAuthenticationFilter之前;(2)jwt验证通过则不需要执行账户密码拦截,但是会执行两次jwt拦截,原因不清楚;(3)如果jwt没有通过,将会执行... 查看详情
springsecurity自定义登录认证与数据持久化
...取的,在实际项目中,用户信息肯定要存入数据库之中。SpringSecurity支持多种用户定义方式,接下来我们就逐个来看一下这些定义方式。通过前面的介绍(参见3小节),大家对 查看详情
springsecurity实现登录认证和权限控制
参考技术A常见的安全管理框架包括Shiro、SpringSecurity,Shiro轻量级,但SpringSecurity易于SpringCloud整合。SpringSecurity除了认证和授权两个核心功能外,对常见的网络攻击也提供了防御策略。SpringSecurity中,认证、授权等功能都是基于过... 查看详情
springsecurity问题记录
...。最近觉得应该去了解规范的用户及权限认证技术了,从SpringSecurity开始学习使用。本文记录学习SpringSecurity过程中遇到的一些问题及解决方案。1.版本问题SpringBoot2.x和SpringSecurity5.x前配置用户名密码:security.user.name=admi 查看详情
springsecurity如何保存重定向地址
基于SpringSecurityOAuth2实现单点登录——未认证的请求是如何重定向到登录地址的?(SpringSecurity的认证流程)1、前言 在上一篇《入门示例和流程分析》的流程分析过程中,当第一次(未认证的情况下)访问应用A(http://lo... 查看详情
《springsecurity框架专题》-03实现自定义登录界面(代码片段)
...目录1.页面准备1.1.login.jsp页面1.2.home.jsp页面1.3.其他页面2.SpringSecurity相关配置2.1.配置认证信息3.登录测试4.关闭csrf拦截5.csrf防护5.1.CsrfFilter源码查看5.2.在认证页面携带token请求6.注销前面通过入门案例介绍,我们发现在SpringSecurity... 查看详情
springsecurity自定义登录认证
一、前言本篇文章将讲述SpringSecurity自定义登录认证校验用户名、密码,自定义密码加密方式,以及在前后端分离的情况下认证失败或成功处理返回json格式数据温馨小提示:SpringSecurity中有默认的密码加密方式以及登录用户认证... 查看详情
springsecurity中的自动登录(代码片段)
...c;如果查询到对应的信息,认证成功,可以登录。springsecurity底层实现具体实现创建数据表CREATETABLE`persistent_login 查看详情
数字化校园平台问题-oa密码忘记如何处理
关于OA登录密码忘记了如何处理问题 目前统一身份认证系统已经对OA系统进行了集成,忘记了OA的密码是可以通过统一身份认证平台认证后登陆OA系统的。但是考虑到大家需要直接登录OA系统,包括通过微信端绑定OA账户也... 查看详情
springsecurity密码登录的流程分析
参考技术A一、用户名密码登录处理过程(springsecurity实现的处理流程):1.密码登录的请求会进入一个叫做UsernamePasswordAuthenticationFilter的过滤器2.这个过滤器会拿到用户名和密码组装成UsernamePasswordAuthenticationToken这样一个对象3.然... 查看详情
springsecurity源码:登录认证源码流程(代码片段)
...程概述为什么继承不同的类?三、总结四、系列文章SpringSecurity系列SpringSecurityOAuth系列〇、写在前面本篇是基于前两篇Demo进行的登录认证源码流程的讲解,可以先大致看看前两篇,能主动来了解源码,我想对使用... 查看详情
springsecurity+jwt实现登录认证
参考技术A这是一个JWT的字符串可以在该网站上获得解析结果:https://jwt.io/1.Web安全配置:2.定义接口UserService去继承UserDetailsService3.定义实现类UserServiceImpl实现UserService4.自定义用户名密码登录,也就是UsernamePasswordAuthenticationFilter... 查看详情
使用 Spring Security 无需授权的预认证
】使用SpringSecurity无需授权的预认证【英文标题】:Pre-AuthenticationwithoutAuthorizationusingSpringSecurity【发布时间】:2014-04-0215:43:42【问题描述】:我的要求是:在我的应用程序中,当用户通过登录屏幕(而不是使用SpringSecurity)登录... 查看详情
springsecurity实现前后端分离项目的登录认证
一、文章简介本文简要介绍了springsecurity的基本原理和实现,并基于springboot整合了springsecurity实现了基于数据库管理的用户的登录和登出,登录过程实现了验证码的校验功能。二、springsecurity框架简介 SpringSecurity是一个能够为... 查看详情
springsecurity实现自定义登录和认证:使用自定义的用户进行认证(代码片段)
1SpringSecurity1.1导入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>1.2编写配置类在spring最新版中禁用了WebSecurityConfigurerAdapter类,官方推荐采用配置... 查看详情