下面是详细讲解“Spring security认证两类用户代码实例”的完整攻略。
1. Spring Security认证两类用户
Spring Security可以认证两类用户:前台用户和后台用户。在实际开发中,这两类用户需要分别进行认证,才能保证系统的安全性。
1.1 前台用户
前台用户是指普通用户,通常需要进行注册、登录等操作。Spring Security可以通过配置WebSecurityConfigurerAdapter
来实现前台用户的认证。
以下是一个示例代码:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/login").permitAll()
.antMatchers("/register").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.failureUrl("/login?error=true")
.usernameParameter("username")
.passwordParameter("password")
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/")
.and()
.csrf().disable();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
}
}
在上述代码中,configure(HttpSecurity http)
方法用于配置HTTP请求的权限,configure(AuthenticationManagerBuilder auth)
方法用于配置用户认证。
首先,我们给定了一些匹配规则,例如访问"/"、"/login"和"/register"页面时不需要认证。任何其他请求都需要认证。
接下来,我们配置了表单登录,并设置了登录页面、成功后跳转的页面、失败后跳转的页面等属性。
最后,我们关闭了CSRF(Cross-Site Request Forgery)保护,因为在实际开发中,CSRF攻击并不常见,而且会增加系统的复杂度。
1.2 后台用户
后台用户是指系统管理员或具有管理员权限的用户。Spring Security可以通过配置GlobalMethodSecurityConfiguration
和@PreAuthorize
注解来实现后台用户的认证。
以下是一个示例代码:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
}
}
在上述代码中,我们启用了prePostEnabled属性,这样就可以在方法级别上进行认证了。在需要认证的方法上面加上@PreAuthorize
注解,例如:
@PreAuthorize("hasRole('ROLE_ADMIN')")
public void deleteUsers(List<User> userList) {
// ...
}
上面的代码表示,只有具有"ROLE_ADMIN"角色的用户才能执行deleteUsers方法。
2. 示例
接下来,我们来看两个实际的示例:如何使用Spring Security认证前台用户和后台用户。
2.1 认证前台用户
假设我们正在开发一个电商网站,用户需要进行登录才能购买商品。我们可以使用Spring Security来实现用户的认证。
首先,我们需要一个用户模型,例如:
public class User implements UserDetails {
private Long id;
private String username;
private String password;
private String email;
private Collection<? extends GrantedAuthority> authorities;
// ...
}
在这个模型中,我们实现了UserDetails
接口,这样Spring Security才能识别我们的用户模型。
接下来,我们需要一个用户服务,例如:
@Service
public class UserService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
User user = userRepository.findByUsername(s);
if (user == null) {
throw new UsernameNotFoundException("用户不存在!");
}
return user;
}
public void register(User user) {
user.setPassword(passwordEncoder.encode(user.getPassword()));
userRepository.save(user);
}
}
在上述代码中,我们使用UserRepository
来查询用户信息,使用PasswordEncoder
来加密密码。此外,我们还提供了一个注册方法,用于将用户保存到数据库中。
然后,我们需要一个登录页面和一个注册页面,例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="/login" method="post">
<input type="text" name="username" placeholder="用户名"><br>
<input type="password" name="password" placeholder="密码"><br>
<button type="submit">登录</button>
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="/register" method="post">
<input type="text" name="username" placeholder="用户名"><br>
<input type="password" name="password" placeholder="密码"><br>
<input type="email" name="email" placeholder="邮箱"><br>
<button type="submit">注册</button>
</form>
</body>
</html>
最后,我们需要在SecurityConfig
中对前台用户进行认证:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserService userService;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/login").permitAll()
.antMatchers("/register").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.failureUrl("/login?error=true")
.usernameParameter("username")
.passwordParameter("password")
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/")
.and()
.csrf().disable();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService).passwordEncoder(passwordEncoder);
}
}
到此为止,前台用户的认证已经完成。
2.2 认证后台用户
假设我们正在开发一个CMS系统,需要具有管理员权限的用户才能对文章进行管理。我们可以使用Spring Security来实现后台用户的认证。
首先,我们需要一个用户模型和一个角色模型,例如:
public class User implements UserDetails {
private Long id;
private String username;
private String password;
private String email;
private List<Role> roles;
// ...
}
public class Role implements GrantedAuthority {
private Long id;
private String name;
// ...
}
在这个模型中,我们使用了GrantedAuthority
接口来表示用户的角色。
接下来,我们需要一个用户服务、一个角色服务和一个方法级别的认证,例如:
@Service
public class UserService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
User user = userRepository.findByUsername(s);
if (user == null) {
throw new UsernameNotFoundException("用户不存在!");
}
return user;
}
@PreAuthorize("hasRole('ROLE_ADMIN')")
public void deleteArticle(Long articleId) {
// ...
}
}
@Service
public class RoleService {
@Autowired
private RoleRepository roleRepository;
public Role findByName(String name) {
return roleRepository.findByName(name);
}
}
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Autowired
private UserService userService;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService).passwordEncoder(passwordEncoder);
}
}
在上述代码中,我们使用hasRole
表达式来判断用户是否具有"ROLE_ADMIN"角色,在需要认证的方法上面加上@PreAuthorize
注解。
最后,我们需要在MethodSecurityConfig
中对后台用户进行认证:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Autowired
private UserService userService;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService).passwordEncoder(passwordEncoder);
}
}
到此为止,后台用户的认证已经完成。
以上就是“Spring Security认证两类用户代码实例”的详细攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring security认证两类用户代码实例 - Python技术站