下面是启用Spring Boot Security后登录Web页面需要用户名和密码的解决方法的完整攻略,包括以下步骤:
1. 添加Spring Boot Security依赖
在pom.xml
文件中添加Spring Boot Security依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. 配置Spring Boot Security
在application.properties
文件中添加以下配置:
#开启security
security.enabled=true
#配置用户信息来源
security.user.name=admin
security.user.password=admin
3. 创建登录页面
在/src/main/resources/templates
目录下创建login.html
文件,如下所示:
<!DOCTYPE html>
<html xmlns:th="https://www.thymeleaf.org">
<head>
<title>Login Page</title>
</head>
<body>
<h1>Login Page</h1>
<form th:action="@{/login}" method="post">
<div>
<label>Username:</label>
<input type="text" name="username" />
</div>
<div>
<label>Password:</label>
<input type="password" name="password" />
</div>
<button type="submit">Log in</button>
</form>
</body>
</html>
4. 创建Web安全配置
在项目中创建一个类,并使用@Configuration
和@EnableWebSecurity
注解来声明配置类,并通过继承WebSecurityConfigurerAdapter
来将配置应用到Spring Boot Security中。在配置类中,还需要使用@EnableGlobalMethodSecurity(prePostEnabled = true)
注解启用方法级别的安全性。
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/css/**", "/js/**").permitAll()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.permitAll()
.and()
.logout()
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
在上面的配置中,我们配置的是HttpSecurity对象的基本安全性和表单登录,其中:
authorizeRequests
方法表示匹配器,表示哪些请求需要被拦截,哪些请求放行,其中.antMatchers("/login").permitAll()
表示允许访问登录页面。formLogin
方法表示表单登录相关的配置,包括登录页面的URL和登录成功后跳转的URL。logout
方法表示退出登录的功能。
5. 创建自定义UserDetailsService
创建一个继承了UserDetailsService
的类,用于实现从数据库中获取用户信息。
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("User not found");
}
return new org.springframework.security.core.userdetails.User(user.getUsername(),
user.getPassword(), Collections.emptyList());
}
}
在上述代码中,我们使用了userRepository
来获取用户信息,并实现了loadUserByUsername
方法来获取用户信息。
6. 创建数据库表和实体类
创建数据库表用于存储用户信息,包括用户名、密码等,并创建对应的实体类。这个部分根据具体的数据库和框架来定制,这里不再赘述。
示例说明
示例1: 自定义登录页面模板
可以根据自己的业务需求自定义登录页面模板,这里提供一个模板作为参考:
<!DOCTYPE html>
<html xmlns:th="https://www.thymeleaf.org">
<head>
<title>Login Page</title>
</head>
<body>
<h1>Login Page</h1>
<form class="form-signin" th:action="@{/login}" method="post">
<h2 class="form-signin-heading">Please sign in</h2>
<input type="text" class="form-control" name="username" placeholder="Username" required="true" autofocus="true"/>
<input type="password" class="form-control" name="password" placeholder="Password" required="true"/>
<div th:if="${param.error}">
<div class="alert alert-danger alert-dismissible fade show mt-1" role="alert">
Invalid username and password.
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit">Log in</button>
</form>
</body>
</html>
示例2:增加角色权限控制
如果我们需要控制某些页面或操作只能被特定的用户或角色访问或执行,可以做如下配置:
在配置文件中增加角色信息:
security.user.role=ROLE_ADMIN
修改WebSecurityConfig并增加Role
判断:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Value("${security.user.role}")
private String role;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/css/**", "/js/**").permitAll()
.antMatchers("/login").permitAll()
.antMatchers("/admin/**").hasRole(role)
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.permitAll()
.and()
.logout()
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
在上面的配置中,我们添加了.antMatchers("/admin/**").hasRole(role)
表示所有以/admin
开头的路径只能被ROLE_ADMIN
角色访问。
此时,我们需要在CustomUserDetailsService
中实现UserDetails
接口的getAuthorities()
方法用于返回用户的权限角色信息,如下所示:
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("User not found");
}
Set<GrantedAuthority> authorities = new HashSet<>();
authorities.add(new SimpleGrantedAuthority(user.getRole()));
return new org.springframework.security.core.userdetails.User(user.getUsername(),
user.getPassword(), authorities);
}
}
在上面的代码中,我们在返回UserDetails
对象时,添加了用户角色信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:启用springboot security后登录web页面需要用户名和密码的解决方法 - Python技术站