feat(backoffice): authenticate Smilegate tool users from ADB
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
package com.cloudhandson.vpdbackoffice.config;
|
||||
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
@@ -9,10 +10,12 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||
import org.springframework.security.core.userdetails.User;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
||||
import org.springframework.security.web.SecurityFilterChain;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
|
||||
@Configuration
|
||||
public class SecurityConfig {
|
||||
@@ -75,30 +78,48 @@ public class SecurityConfig {
|
||||
|
||||
@Bean
|
||||
UserDetailsService userDetailsService(
|
||||
ObjectProvider<JdbcTemplate> jdbcTemplateProvider,
|
||||
BackofficeProperties properties,
|
||||
PasswordEncoder passwordEncoder
|
||||
) {
|
||||
var security = properties.security();
|
||||
String encodedPassword = security.adminPasswordHash() == null || security.adminPasswordHash().isBlank()
|
||||
? passwordEncoder.encode(security.adminPassword())
|
||||
: security.adminPasswordHash();
|
||||
List<UserDetails> users = new ArrayList<>();
|
||||
users.add(User.withUsername(security.adminUser())
|
||||
// BCrypt encoding includes a random salt. Re-encoding the configured
|
||||
// password on every startup would invalidate remember-me signatures.
|
||||
.password(encodedPassword)
|
||||
.roles("ADMIN")
|
||||
.build());
|
||||
if (security.guestConfigured()) {
|
||||
String encodedGuestPassword = security.guestPasswordHash() == null || security.guestPasswordHash().isBlank()
|
||||
? passwordEncoder.encode(security.guestPassword())
|
||||
: security.guestPasswordHash();
|
||||
users.add(User.withUsername(security.guestUser())
|
||||
.password(encodedGuestPassword)
|
||||
.roles("VIEWER")
|
||||
.build());
|
||||
JdbcTemplate jdbcTemplate = jdbcTemplateProvider.getIfAvailable();
|
||||
if (jdbcTemplate == null) {
|
||||
String encodedPassword = properties.security().adminPasswordHash() == null
|
||||
|| properties.security().adminPasswordHash().isBlank()
|
||||
? passwordEncoder.encode(properties.security().adminPassword())
|
||||
: properties.security().adminPasswordHash();
|
||||
List<UserDetails> users = new ArrayList<>();
|
||||
users.add(User.withUsername(properties.security().adminUser())
|
||||
.password(encodedPassword)
|
||||
.roles("ADMIN")
|
||||
.build());
|
||||
if (properties.security().guestConfigured()) {
|
||||
String encodedGuestPassword = properties.security().guestPasswordHash() == null
|
||||
|| properties.security().guestPasswordHash().isBlank()
|
||||
? passwordEncoder.encode(properties.security().guestPassword())
|
||||
: properties.security().guestPasswordHash();
|
||||
users.add(User.withUsername(properties.security().guestUser())
|
||||
.password(encodedGuestPassword)
|
||||
.roles("VIEWER")
|
||||
.build());
|
||||
}
|
||||
return new InMemoryUserDetailsManager(users);
|
||||
}
|
||||
return new InMemoryUserDetailsManager(users);
|
||||
return username -> jdbcTemplate.query(
|
||||
"""
|
||||
select user_id, password_hash, role_code
|
||||
from sg_tool_user
|
||||
where user_id = ?
|
||||
and enabled_yn = 'Y'
|
||||
""",
|
||||
(resultSet, rowNum) -> User.withUsername(resultSet.getString("user_id"))
|
||||
.password(resultSet.getString("password_hash"))
|
||||
.roles("TEAM_LEAD".equals(resultSet.getString("role_code")) ? "ADMIN" : "VIEWER")
|
||||
.build(),
|
||||
username
|
||||
).stream().findFirst().orElseThrow(
|
||||
() -> new UsernameNotFoundException("Unknown or disabled tool user")
|
||||
);
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
Reference in New Issue
Block a user