Spring Security身份验证详细介绍( 六 )


摘要中心身份验证是一个“nonce” 。这是服务器生成的值 。Spring Security的nonce采用以下格式:
示例:摘要语法
base64(expirationTime + ":" + md5Hex(expirationTime + ":" + key))expirationTime:The date and time when the nonce expires, expressed in millisecondskey:A private key to prevent modification of the nonce token你需要确保你配置了不安全的明文密码存储使用NoOpPasswordEncoder。以下是使用Java配置配置摘要认证的示例:
@AutowiredUserDetailsService userDetailsService;DigestAuthenticationEntryPoint entryPoint() {DigestAuthenticationEntryPoint result = new DigestAuthenticationEntryPoint();result.setRealmName("My App Relam");result.setKey("3028472b-da34-4501-bfd8-a355c42bdf92");}DigestAuthenticationFilter digestAuthenticationFilter() {DigestAuthenticationFilter result = new DigestAuthenticationFilter();result.setUserDetailsService(userDetailsService);result.setAuthenticationEntryPoint(entryPoint());}protected void configure(HttpSecurity http) throws Exception {http// ....exceptionHandling(e -> e.authenticationEntryPoint(authenticationEntryPoint())).addFilterBefore(digestFilter());}

  • 基于内存的身份验证
Spring Security的
InMemoryUserDetailsManager实现了UserDetailsService,以支持在内存中检索的基于用户名/密码的身份验证 。InMemoryUserDetailsManager通过实现UserDetailsManager接口来提供对UserDetails的管理 。当Spring Security配置为接受用户名/密码进行身份验证时,将使用基于UserDetails的身份验证 。
在这个示例中,我们使用Spring Boot CLI对password的密码进行编码,并获得编码后的密码{bcrypt}$2a$10$
GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW 。
示例:
InMemoryUserDetailsManager的java配置示例
@Beanpublic UserDetailsService users() {UserDetails user = User.builder().username("user").password("{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW").roles("USER").build();UserDetails admin = User.builder().username("admin").password("{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW").roles("USER", "ADMIN").build();return new InMemoryUserDetailsManager(user, admin);}上面的示例以安全的格式存储密码,但是在开始体验方面还有很多不足之处 。在下面的示例中,我们利用了
User.withDefaultPasswordEncoder来确保存储在内存中的密码是受保护的 。但是,它不能通过反编译源代码来防止获得密码 。出于这个原因,User.withDefaultPasswordEncoder应该只用于“入门”,而不是用于生产 。
示例:使用
User.withDefaultPasswordEncoder的InMemoryUserDetailsManager
@Beanpublic UserDetailsService users() {// The builder will ensure the passwords are encoded before saving in memoryUserBuilder users = User.withDefaultPasswordEncoder();UserDetails user = users.username("user").password("password").roles("USER").build();UserDetails admin = users.username("admin").password("password").roles("USER", "ADMIN").build();return new InMemoryUserDetailsManager(user, admin);}
  • 基于JDBC的身份验证
Spring Security的JdbcDaoImpl实现了UserDetailsService来提供对使用JDBC检索的基于用户名/密码的身份验证的支持 。JdbcUserDetailsManager扩展了JdbcDaoImpl,通过UserDetailsManager接口提供对UserDetails的管理 。当Spring Security配置为接受用户名/密码进行身份验证时,将使用基于UserDetails的身份验证 。
在下面的内容中,我们将讨论:
  • Spring安全JDBC身份验证使用的默认模式
  • 设置数据源
  • JdbcUserDetailsManager Bean
默认模式
Spring Security为基于JDBC的身份验证提供默认查询 。本节提供与默认查询相对应的默认模式 。您将需要调整模式,以匹配与您正在使用的查询和数据库方言相匹配的定制 。
用户模式
JdbcDaoImpl需要表来加载用户的密码、帐户状态(启用或禁用)和权限(角色)列表 。需要的默认模式可以在下面找到 。
默认模式也公开为一个名为
org/springframework/security/core/userdetails/jdbc/users.ddl的类路径资源 。
示例:默认用户模式
create table users(username varchar_ignorecase(50) not null primary key,password varchar_ignorecase(500) 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);


推荐阅读