Oracle是一种流行的数据库选择,但是需要略微不同的模式 。您可以在下面找到用于用户的默认Oracle模式 。
针对Oracle的默认用户模式
CREATE TABLE USERS (USERNAME NVARCHAR2(128) PRIMARY KEY,PASSWORD NVARCHAR2(128) NOT NULL,ENABLED CHAR(1) CHECK (ENABLED IN ('Y','N') ) NOT NULL);CREATE TABLE AUTHORITIES (USERNAME NVARCHAR2(128) NOT NULL,AUTHORITY NVARCHAR2(128) NOT NULL);ALTER TABLE AUTHORITIES ADD CONSTRAINT AUTHORITIES_UNIQUE UNIQUE (USERNAME, AUTHORITY);ALTER TABLE AUTHORITIES ADD CONSTRAINT AUTHORITIES_FK1 FOREIGN KEY (USERNAME) REFERENCES USERS (USERNAME) ENABLE;
组模式
如果您的应用程序需要组,您将需要提供组模式 。组的默认模式可以在下面找到 。
默认组模式:
create table groups (id bigint generated by default as identity(start with 0) primary key,group_name varchar_ignorecase(50) not null);create table group_authorities (group_id bigint not null,authority varchar(50) not null,constraint fk_group_authorities_group foreign key(group_id) references groups(id));create table group_members (id bigint generated by default as identity(start with 0) primary key,username varchar(50) not null,group_id bigint not null,constraint fk_group_members_group foreign key(group_id) references groups(id));
设置数据源
在配置JdbcUserDetailsManager之前,必须创建一个数据源 。在我们的示例中,我们将设置一个使用默认用户模式初始化的嵌入式数据源 。
示例:嵌入式数据来源
@BeanDataSource dataSource() {return new EmbeddedDatabaseBuilder().setType(H2).addScript("classpath:org/springframework/security/core/userdetails/jdbc/users.ddl").build();}
在生产环境中,您将希望确保建立到外部数据库的连接 。
JdbcUserDetailsManager Bean
在这个示例中,我们使用Spring Boot CLI对password的密码进行编码,并获得编码后的密码{bcrypt}$2a$10$
GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW 。
示例:JdbcUserDetailsManager
@BeanUserDetailsManager users(DataSource dataSource) {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();JdbcUserDetailsManager users = new JdbcUserDetailsManager(dataSource);users.createUser(user);users.createUser(admin);}
UserDetails
UserDetails由UserDetailsService返回 。DaoAuthenticationProvider验证UserDetails,然后返回一个Authentication,该Authentication有一个主体,该主体是由已配置的UserDetailsService返回的UserDetails 。
UserDetailsService
DaoAuthenticationProvider使用UserDetailsService检索用户名、密码和其他属性,以验证用户名和密码 。Spring Security提供了UserDetailsService的内存和JDBC实现 。
您可以通过将自定义UserDetailsService公开为bean来定义自定义身份验证 。例如,以下将自定义身份验证,假设CustomUserDetailsService实现了UserDetailsService:
只有当
AuthenticationManagerBuilder没有被填充并且AuthenticationProviderBean没有被定义时才会使用 。
@BeanCustomUserDetailsService customUserDetailsService() {return new CustomUserDetailsService();}
PasswordEncoder
Spring Security的servlet通过与PasswordEncoder集成来支持安全存储密码 。定制Spring Security使用的PasswordEncoder实现可以通过公开PasswordEncoder Bean来完成 。
DaoAuthenticationProvider
DaoAuthenticationProvider是一个AuthenticationProvider实现,它利用UserDetailsService和PasswordEncoder来验证用户名和密码 。让我们看看DaoAuthenticationProvider是如何在Spring Security中工作的 。图中解释了读取用户名和密码中的AuthenticationManager如何工作的细节 。
文章插图
文章插图
使用DaoAuthenticationProvider
①读取用户名和密码的身份验证过滤器将
UsernamePasswordAuthenticationToken传递给AuthenticationManager,这是由ProviderManager实现的 。
②ProviderManager被配置为使用DaoAuthenticationProvider类型的AuthenticationProvider 。
③DaoAuthenticationProvider从UserDetailsService中查找UserDetails 。
④然后,DaoAuthenticationProvider使用PasswordEncoder验证上一步返回的UserDetails上的密码 。
⑤当身份验证成功时,返回的身份验证类型为
UsernamePasswordAuthenticationToken,并且具有一个主体,该主体是由已配置的UserDetailsService返回的UserDetails 。最终,返回的UsernamePasswordAuthenticationToken将由身份验证过滤器在SecurityContextHolder上设置 。
推荐阅读
- 严国华|《罚罪》唐绍文身份曝光,他确实是卧底,但并非听命于严国华
- 肖振邦|《罚罪》仅剩6集!肖振邦的结局注定悲惨,邱涛的真实身份即将暴露
- 浙江卫视|前浙江卫视主持人突然晒娃,曾和杨迪传绯闻,圈外丈夫仍身份成谜
- 李伯东|罚罪:李伯东真实身份曝光,与张秋峰联手上演碟中谍
- 章安仁|《流金岁月》,章安仁或许对蒋南孙有一丝喜欢,更爱的是她的身份
- 赵鹏超|《罚罪》最狠毒之人,为钱抛弃所有亲人,“大王”身份实至名归
- |探秘新钓点鱼影都没见到,却意外钩起一螃蟹,得知身份后高兴坏了
- 陆安然|覆流年:5000两买下的冬青身份不简单,陆安然既送了人情又得忠仆
- |40岁韩国男星染毒被逮!身份被网友找到了!
- 吴镇宇|吴镇宇:坐公交被指责不该坐老人座,无奈掏出身份证,引无限感慨