Ja ich habe schon eine spring Boot Anwendung und damit Rest gebaut.Der WebSecurityConfigurerAdapter gehört zu Spring. Willst du eine Spring Boot Anwendung erstellen? Oder eine Java EE? Oder irgendwas anders.
Genau, das hatte ich auch schon in Betracht gezogen, nur ich finde in dem GitHub nicht die Klassen, wo es beschrieben wird.![]()
Spring Security without the WebSecurityConfigurerAdapter
Level up your Java code and explore what Spring can do for you.spring.io
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>de.webauth</groupId>
<artifactId>auth</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>auth</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity6</artifactId>
<!-- Temporary explicit version to fix Thymeleaf bug -->
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((requests) -> requests.requestMatchers("/", "/home").permitAll().anyRequest().authenticated())
.formLogin((form) -> form.loginPage("/login").permitAll()).logout((logout) -> logout.permitAll());
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
@Bean
public PasswordEncoder encoder() {
return new BCryptPasswordEncoder();
}
In der Klasse wo man die spring Boot Anwendung startet?Du brauchst einfach einen Bean, der einen UserPasswordEncoder bereit stellt. Also etwas wie
Java:@Bean public PasswordEncoder encoder() { return new BCryptPasswordEncoder(); }
Das ist eigentlich egal. Die Klasse muss gescannt werden, damit Spring Boot weiß, dass es da die Methode gibt, die so einen Bean erstellt.In der Klasse wo man die spring Boot Anwendung startet?
Wie sieht denn Dein UserDetailsService nun aus? Hast Du immer noch den gleichen code da drin? Oder was machst Du da derzeit?Wenn ich die Methode
eintrage, egal wo, dann kann ich mich nicht mehr einloggen.Java:@Bean public PasswordEncoder encoder() { return new BCryptPasswordEncoder(); }
User.withUsername("user")
.password(encoder.encode("password"))
.roles("USER")
.build();
Bisher hatte ich noch den alten Code verwendet.Wie sieht denn Dein UserDetailsService nun aus? Hast Du immer noch den gleichen code da drin? Oder was machst Du da derzeit?
public class User {
@Id
@GeneratedValue
@Column(name="user_id")
private Integer id;
@Column(name="user_name")
private String name;
@Column(name="user_passwd")
private String password;
@Column(name="user_email")
private String email;
@ElementCollection(fetch= FetchType.EAGER)
@CollectionTable(
name="roles",
joinColumns = @JoinColumn(name="user_id")
)
@Column(name="user_role")
private List<String> roles;
}
@Service
public class UserServiceImpl implements IUserService, UserDetailsService{
@Autowired
private UserRepository userRepo;
@Autowired
private BCryptPasswordEncoder passwordEncoder;
@Override
public Integer saveUser(User user) {
String passwd= user.getPassword();
String encodedPasswod = passwordEncoder.encode(passwd);
user.setPassword(encodedPasswod);
user = userRepo.save(user);
return user.getId();
}
@Override
public UserDetails loadUserByUsername(String email)
throws UsernameNotFoundException {
Optional<User> opt = userRepo.findUserByEmail(email);
if(opt.isEmpty())
throw new UsernameNotFoundException("User with email: " +email +" not found !");
else {
User user = opt.get();
return new org.springframework.security.core.userdetails.User(
user.getEmail(),
user.getPassword(),
user.getRoles()
.stream()
.map(role-> new SimpleGrantedAuthority(role))
.collect(Collectors.toSet())
);
}
public interface UserRepository extends JpaRepository<User, Integer> {
Optional<User> findUserByEmail(String email);
public interface UserRepo extends JpaRepository<User, Long>{
List<User> findByName(String lastName);
User findById(long id);
}
@Configuration
@EnableMethodSecurity
public class SecurityConfig {
@Bean
public static PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
//http.csrf().disable().authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated()).httpBasic(Customizer.withDefaults());
http.authorizeHttpRequests().requestMatchers("/api/all").hasRole("USER").and().formLogin(Customizer.withDefaults()).httpBasic(Customizer.withDefaults());
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails matze = User.builder()
.username("matze").password(passwordEncoder().encode("1"))
.roles("USER").build();
UserDetails admin = User.builder()
.username("admin").password(passwordEncoder().encode("2"))
.roles("ADMIN").build();
return new InMemoryUserDetailsManager(matze, admin);
}