Custom UserDetailsService Of Spring Security#
Create Your Own Custom Implementation of UserDetailsService#
- In this section we will create our custom implementation of UserDetailsService. So, why do we need to create a custom implementation of
UserDetailsService
of spring security? - The answer is that when you already have an database with users and authorities and you just want to migrate your existed users in the database into the spring security for using but your existing table is so different with the default implementation of spring security such as
JdbcUserDetailsManager
(See Configure Users With JdbcUserDetailsManager) . So we need to create your own customUserDetailsService
implementation
Dependencies#
- We will use Spring Data JPA to integrate with the
customers
table that we defined in the database. So you will need to add some dependencies as below.
pom.xml | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
Prepare Tables In Database#
- Now let's use the script below to create your own table in the database for storing customer users. You should note that the column's names and table's name don't need to have the same name as in the default implementation in spring security, you can put any name you want for table and column names here.
1 2 3 4 5 6 7 8 9 10 11 |
|
Create Entity Class#
- Now let's create the
CustomerEntity
class which will be mapped with tablecustomers
in your database as below
CustomerEntity.java | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Create CustomerRepository#
- Next, we will create the
CustomerRepository
interface for ourCustomerEntity
above with a method for getting the CustomerEntities by email.
CustomerRepository.java | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Create Your Custom Implementation of UserDetails#
- Now, we will create a class name
SecurityCustomer
for our customUserDetails
implementation. This class will have 1 attribute which is theCustomerEntity
which we will load from our database. Because in our database we don't have column forAccountNonExpired
,AccountNonLocked
,CredentialsNonExpired
andEnabled
so we will set them as true.
SecurityCustomer.java | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
|
Create Your Custom Implementation Of UserDetailsService#
- We will crate a class name
BankUserDetailsService
which will implement theUserDetailsService
for our customUserDetailsService
implementation. So we will@Override
the methodloadUserByUsername
ofUserDetailsService
BankUserDetailsService.java | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
- We will use
CustomerRepository
to load our CustomerEntity from database then we will use this CustomerEntity to create theSecurityCustomer
which is the implementation ofUserDetails
. - So we have done custom the
UserDetailsService
.
Configure Spring Security#
- Now, let's open the class
ProjectSecurityConfig
and comment the configuration related toJdbcUserDetailsManager
as below
ProjectSecurityConfig.java | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
Enable JPA Repositories#
- Go to the main class and add the annotation
@EnableJpaRepositories
as below
CustomDefaultSpringSecurityApplication.java | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Configure DataSource#
- Now, let add the datasource configuration in the
application.yml
. Then start the application up to test.application.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#spring: # security: # user: # name: user # password: 12345 # #server: # servlet: # session: # timeout: 1m spring: datasource: url: jdbc:mysql://localhost:3306/worldbank?useUnicode=true&characterEncoding=UTF-8 username: root password: password
Testing#
- Now let's start your spring boot application and try to use the email/password that existed in the database for authentication and you will see the successful result as below.
See Also#
- Configure Users With JdbcUserDetailsManager
- Defining And Managing Users
- Understanding User Management interfaces and Classes