- 浏览: 189295 次
- 性别:
- 来自: 南京
文章分类
最新评论
前言:
作为spring security的核心类,大多数的认证方式都会用到UserDetailsService和UserDetails这两个接口,本文会详细探讨下UserDetailsService及其实现类。
1. UserDetailsService接口
在spring security中,为了方便扩展,UserDetailsService接口被设计的极其简单,只包含一个方法
根据提供的用户名,查找对应的用户信息,只是查找信息,没有和认证相关的任何逻辑,是DaoAuthenticationProvider默认使用的用户信息加在类,返回的UserDetails也是一个接口。根据具体实现的不同,做用户信息查找时即有可能是大小写敏感,也有可能不敏感,所以UserDetails中的用户名并不一定和传入的用户名一致。在一些认证方式中,即便他们并不真的使用用户名和密码,也会用到UserDetailsService类,可能仅仅是想利用UserDetails对象中的GrantedAuthority信息来做权限判断(如LDAP、X.509、CAS等,这些认证系统自身承担着验证证书是否有效的任务)。
因为UserDetailsService接口是如此简单,我们很容易实现他,来自定义我们获取用户信息的逻辑,同时spring security也为我们提供了一些基本常见的实现。
2.基于内存的认证
自定义UserDetailsService从我们喜欢的一种数据持久化引擎中(文件、数据库等)获取数据并不麻烦,但有时候我们并不需要这么复杂的实现,例如我们仅仅是做一个spring security的原型、或者是在学习spring security,你并不想花时间来搭建一个数据库,此时就可以以使用基于内存的用户信息存储,使用java config配置用户信息如下:
这种方式还支持properties文件来配置
properties的文件格式如下:
例如
还可以使用如下代码段来创建
3.基于关系数据库的认证
3.1 spring security也为我们提供了一个从关系型数据库获取认证信息的实现-JdbcDaoImpl,在这个类内部使用了Spring JDBC,下面是一个具体使用的配置例子
完整的例子请参考spring-security(四)java config-sample之jdbc
3.2 默认情况下,JdbcDaoImpl直接从数据库中获取某个特定用户对应的权限列表信息,在实际应用中我们可能会先将用户分组,再把具体的权限赋予某个分组,从而使这个组里面的用户都具有这些权限,JdbcDaoImpl也为我们提供了 分组的支持,默认情况下没有启用,如果想使用这个功能,可以通过如下设置
如果spring 默认的schema不能满足我们的业务需求(表结构的定义、信息的完整性),我们也可以利用JdbcDaoImpl,重写其中的查询语句,如我们想重写查询用户信息的语句可以如下配置
如果默认实现和我们需求相差太大,简单修改配置已不能满足我们需求,我们可以自己实现加载用户信息的类,就是实现UserDetailsService,并把他作为bean注册到spring 中即可。
这样在程序启动时,配置类InitializeUserDetailsManagerConfigurer加载时,会为我们创建一个DaoAuthenticationProvider,并且使用我们定义的UserDetailsService。具体过程可参考
spring-security(二)java config加载机制-@EnableGlobalAuthentication
作为spring security的核心类,大多数的认证方式都会用到UserDetailsService和UserDetails这两个接口,本文会详细探讨下UserDetailsService及其实现类。
1. UserDetailsService接口
在spring security中,为了方便扩展,UserDetailsService接口被设计的极其简单,只包含一个方法
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
根据提供的用户名,查找对应的用户信息,只是查找信息,没有和认证相关的任何逻辑,是DaoAuthenticationProvider默认使用的用户信息加在类,返回的UserDetails也是一个接口。根据具体实现的不同,做用户信息查找时即有可能是大小写敏感,也有可能不敏感,所以UserDetails中的用户名并不一定和传入的用户名一致。在一些认证方式中,即便他们并不真的使用用户名和密码,也会用到UserDetailsService类,可能仅仅是想利用UserDetails对象中的GrantedAuthority信息来做权限判断(如LDAP、X.509、CAS等,这些认证系统自身承担着验证证书是否有效的任务)。
因为UserDetailsService接口是如此简单,我们很容易实现他,来自定义我们获取用户信息的逻辑,同时spring security也为我们提供了一些基本常见的实现。
2.基于内存的认证
自定义UserDetailsService从我们喜欢的一种数据持久化引擎中(文件、数据库等)获取数据并不麻烦,但有时候我们并不需要这么复杂的实现,例如我们仅仅是做一个spring security的原型、或者是在学习spring security,你并不想花时间来搭建一个数据库,此时就可以以使用基于内存的用户信息存储,使用java config配置用户信息如下:
@Bean public UserDetailsService userDetailsService() { InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); manager.createUser(User.withUsername("user").password("password").roles("USER").build()); manager.createUser(User.withUsername("admin").password("password").roles("ADMIN").build()); return manager; }
这种方式还支持properties文件来配置
@Bean public UserDetailsService userDetailsService() throws FileNotFoundException, IOException { Properties properties = new Properties(); properties.load(getClass().getClassLoader().getResourceAsStream("users.properties")); return new InMemoryUserDetailsManager(properties); }
properties的文件格式如下:
username=password,grantedAuthority[,grantedAuthority][,enabled|disabled]
例如
jimi=jimispassword,ROLE_USER,ROLE_ADMIN,enabled bob=bobspassword,ROLE_USER,enabled
还可以使用如下代码段来创建
@Autowired public void auth(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("admin").password("password").authorities("ROLE_ADMIN").and() .withUser("user").password("password").authorities("ROLE_USER"); }
3.基于关系数据库的认证
3.1 spring security也为我们提供了一个从关系型数据库获取认证信息的实现-JdbcDaoImpl,在这个类内部使用了Spring JDBC,下面是一个具体使用的配置例子
@Bean public DruidDataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUsername("root"); dataSource.setPassword("sso"); dataSource.setName("chengf"); dataSource.setUrl("jdbc:mysql://localhost:3306/chengf?useUnicode=true&characterEncoding=UTF-8"); dataSource.setMaxActive(20); dataSource.setInitialSize(1); dataSource.setMaxWait(60000); dataSource.setMinIdle(1); dataSource.setTimeBetweenEvictionRunsMillis(60000); dataSource.setMinEvictableIdleTimeMillis(300000); dataSource.setValidationQuery("select 'x'"); dataSource.setPoolPreparedStatements(true); dataSource.setMaxPoolPreparedStatementPerConnectionSize(20); return dataSource; } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth, DataSource dataSource) throws Exception { auth.jdbcAuthentication().dataSource(dataSource); }
完整的例子请参考spring-security(四)java config-sample之jdbc
3.2 默认情况下,JdbcDaoImpl直接从数据库中获取某个特定用户对应的权限列表信息,在实际应用中我们可能会先将用户分组,再把具体的权限赋予某个分组,从而使这个组里面的用户都具有这些权限,JdbcDaoImpl也为我们提供了 分组的支持,默认情况下没有启用,如果想使用这个功能,可以通过如下设置
@Autowired public void configureGlobal(AuthenticationManagerBuilder auth, DataSource dataSource) throws Exception { auth.jdbcAuthentication().dataSource(dataSource).getUserDetailsService().setEnableGroups(true);; }
如果spring 默认的schema不能满足我们的业务需求(表结构的定义、信息的完整性),我们也可以利用JdbcDaoImpl,重写其中的查询语句,如我们想重写查询用户信息的语句可以如下配置
@Autowired public void configureGlobal(AuthenticationManagerBuilder auth, DataSource dataSource) throws Exception { auth.jdbcAuthentication().dataSource(dataSource).getUserDetailsService().setEnableGroups(true);; auth.jdbcAuthentication().dataSource(dataSource).usersByUsernameQuery("select username,password,email,phone,address,enabled from my_user_table where username = ? "); }
如果默认实现和我们需求相差太大,简单修改配置已不能满足我们需求,我们可以自己实现加载用户信息的类,就是实现UserDetailsService,并把他作为bean注册到spring 中即可。
@Bean public DruidDataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUsername("root"); dataSource.setPassword("sso"); dataSource.setName("chengf"); dataSource.setUrl("jdbc:mysql://localhost:3306/chengf?useUnicode=true&characterEncoding=UTF-8"); dataSource.setMaxActive(20); return dataSource; } @Bean public UserDetailsService userDetailsService () { MyUserDetailsService userDetailsService = new MyUserDetailsService(); userDetailsService.setDataSource(dataSource()); return userDetailsService; }
这样在程序启动时,配置类InitializeUserDetailsManagerConfigurer加载时,会为我们创建一个DaoAuthenticationProvider,并且使用我们定义的UserDetailsService。具体过程可参考
spring-security(二)java config加载机制-@EnableGlobalAuthentication
发表评论
-
spring-security(二十五)鉴权
2018-03-27 11:21 1550前言 本文将详细探讨spring security中的鉴权 ... -
test
2018-03-19 21:20 0什么是服务发现 ... -
spring-security(二十四)CSRF
2018-03-24 09:54 81271.什么是CSRF攻击 下面我们以一个具体的例子来说明这种常见 ... -
spring-security(二十三)Remember-Me认证
2018-03-09 21:06 1285前言: Remember-me认证方式指的是能在不同的会话 ... -
spring-security(二十二)基本认证和摘要认证
2018-03-06 16:58 1763前言: 在web应用中,非常流行以基本认证和摘要认证作为备 ... -
spring-security(二十一)核心Filter-UsernamePasswordAuthenticationFilter
2018-03-04 11:05 1199一、UsernamePasswordAuthenticatio ... -
spring-security(二十)核心Filter-SecurityContextPersistenceFilter
2018-02-28 21:40 1063一、SecurityContextPersistenceFil ... -
spring-security(十九)核心Filter-ExceptionTranslationFilter
2018-02-27 16:31 1991前言: 在spring的安全 ... -
spring-security(十八)核心Filter-FilterSecurityInterceptor
2018-02-25 10:59 2263前言: 当用spring secur ... -
spring-security(二十六)整合CAS 实现SSO
2018-04-05 18:09 12061.cas 认证流程 2.spring security ... -
spring-security(十七)Filter顺序及简介
2018-02-22 18:16 7800前言: spring security在 ... -
spring-security(十六)Filter配置原理
2018-02-21 15:18 2338前言: spring security最常见的应用场景还是 ... -
spring-security(十五) Password编码
2018-02-19 15:15 1179前言: 在实际应用中 ... -
spring-security(十三)核心服务类
2018-02-18 16:46 1369前言: 在之前的篇章中我们已经讲述了spring secu ... -
spring-security(十二)鉴权方式概述
2018-02-18 10:42 2491前言: 本文主要讲述在spring security鉴权的 ... -
spring-security(十一)Web应用认证过程
2018-02-17 17:17 1210前言: 本文将探讨当 ... -
spring-security(十)基本认证过程
2018-02-17 13:55 2057前言: 在spring security中认证具体指的是什 ... -
spring-security(九)-核心组件
2018-02-17 10:46 826前言: 本文主要介绍在spring security中的几 ... -
spring-security(八)java config-sample之cas client
2018-02-16 11:26 2030前言: SSO英文全称Single Sign On,单点登 ... -
spring-security(七)java config-sample之concurrency
2018-02-15 10:51 633前言: 在实际应用中,我们可能会限制一个用户同时登录同一个 ...
相关推荐
Spring Security-3.0.1 中文官方文档(翻译版) 这次发布的Spring Security-3.0.1 是一个bug fix 版,主要是对3.0 中存在的一些问题进 行修 正。文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行...
Spring Security 参考 1 第一部分前言 15 1.入门 16 2.介绍 17 2.1什么是Spring Security? 17 2.2历史 19 2.3版本编号 20 2.4获得Spring安全 21 2.4.1使用Maven 21 Maven仓库 21 Spring框架 22 2.4.2 Gradle 23 ...
Spring Boot Documentation 1. About the Documentation 2. Getting Help 3. First Steps 4. Working with Spring Boot 5. Learning about Spring Boot Features 6. Moving to Production 7. Advanced Topics II. ...
1.1. Spring Security是什么? 1.2. 历史 1.3. 发行版本号 1.4. 获得Spring Security 1.4.1. 项目模块 1.4.1.1. Core - spring-security-core.jar 1.4.1.2. Web - spring-security-web.jar 1.4.1.3. ...
使用JWT与Spring WebFlux和Spring Security Reactive进行身份验证和授权首先阅读的好文档在开始之前,我建议您先阅读下一份参考启用Spring WebFlux安全性在你的应用程序首先使Webflux安全@EnableWebFluxSecurity...
1.1. Spring Security是什么? 1.2. 历史 1.3. 发行版本号 1.4. 获得Spring Security 1.4.1. 项目模块 1.4.1.1. Core - spring-security-core.jar 1.4.1.2. Web - spring-security-web.jar 1.4.1.3. Config -...
四是修改spring security的源代码,主要是修改InvocationSecurityMetadataSourceService和UserDetailsService两个类。 前者是将配置文件或数据库中存储的资源(url)提取出来加工成为url和权限列表的Map供Security...
Spring Boot 2 OAuth2 JWT授权服务器 链接到项目 关于如何使用Spring Boot 2 , JPA , Hibernate和MySQL使用JWT令牌设置OAuth2授权服务器的简单项目。 简而言之 所有和客户端都存储在数据库中。 可以具有许多与之相...
详解Spring Security进阶身份认证之UserDetailsService(附源码)-附件资源
demo详细讲解了springsecurity自定义UserDetailsService实现方式及security功能模块的配置
四是修改spring security的源代码,主要是修改InvocationSecurityMetadataSourceService和UserDetailsService两个类。前者是将配置文件或数据库中存储的资源(url)提取出来加工成为url和权限列表的Map供Security使用...
- Spring Security - JavaMail - Thymeleaf - HttpClient - FileUpload - Spring Scheduler - Hibernate Validator - Redis Cluster - MySQL主从复制,读写分离 - Spring Async - Spring Cache - Swagger - Spring ...
SpringSecurity使用userDetailsService的方式,访问数据库的权限系统,进行认证操作
基于spring boot+spring security+jwt实现的基础auth机制。在SpringBootApplication上添加@EnableWebSecurityJwt。同时需要自己实现一个UserDetailsService。
Springboot+SpringSecurity+JWT+redis 多参数登录验证,重新 UserDetailsService 实现 loadUserByUserna 多参数方法
spring security 基础项目 包含所需sql 用户实体 映射mapper UserDetailsService改造等 可基本满足 security 入门研究需求
security的四种方法 1. 全部利用配置文件 不使用数据库,全部信息写在配置文件中,如拦截的URL及对应权限,指定用户名、密码和对应权限 2. 数据库+配置文件 数据库存储用户和权限,硬编码配置URL和对应权限 根据...
1、用户验证实现UserDetailsService接口,注意角色需要ROLE_kaitou 2、扩展WebSecurityConfigurerAdapter,覆盖configure(HttpSecurity http) 第一句必须是http.antMatcher("/portal/**").authorizeRequests(),...
Spring Security新增手机号、校验码校验方式,拓展了功能。关键组件就是UserDetails(用户信息描述)、UserDetailsService(操作账户的服务)、WebAuthenticationDetails(提供额外信息认证)、...