关于“Spring Boot如何使用Spring Security进行安全控制”的攻略,我们需要先明确以下几点:
-
Spring Boot集成了Spring Security,只需要在pom.xml中引入Spring Security的依赖即可。
-
Spring Security可以配置多种安全验证方式,比如基于表单的验证、HTTP基本身份验证、OAuth2等。
-
Spring Security的核心是安全Filter链,可以在Filter链中进行自定义验证逻辑。
下面我们来具体步骤讲解如何使用Spring Security进行安全控制。
步骤一:引入Spring Security依赖
在pom.xml中引入Spring Security依赖,可以通过添加以下代码实现:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.4.0</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.4.0</version>
</dependency>
步骤二:启用Spring Security
在Spring Boot的启动类中添加@EnableWebSecurity
注解,表示要启用Spring Security:
@SpringBootApplication
@EnableWebSecurity
public class MyApp {
public static void main(String[ ] args) {
SpringApplication.run(MyApp.class, args);
}
}
当你使用了@EnableWebSecurity
注解时,Spring Boot会自动配置WebSecurityConfigurerAdapter和HttpSecurity。
步骤三:配置Spring Security
在Spring Boot应用中,可以通过在 WebSecurityConfigurerAdapter 类上添加 @EnableGlobalMethodSecurity 注解来启用 Spring Security 提供的基于方法的安全控制。为了方便起见,我们这里设置为禁用基于方法的安全控制。
下面是一个简单的示例代码,展示如何配置Spring Security。其中包含了两个基本配置,一个是拦截器配置,另一个是用户角色权限配置。
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// 配置拦截规则,这里设置所有的url都需要经过登录验证才能访问
http
.authorizeRequests()
.antMatchers("/**").authenticated() //所有的url都需要登录验证才能访问
.and()
// 配置登录功能
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.permitAll()
.and()
// 配置注销功能
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login")
.permitAll();
}
@Override
public void configure(WebSecurity web) throws Exception {
// 配置静态资源等
web.ignoring().antMatchers("/css/**", "/js/**", "/img/**", "/fonts/**", "/favicon.ico");
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// 配置用户角色权限相关
auth
.inMemoryAuthentication()
.passwordEncoder(passwordEncoder())
.withUser("user").password(passwordEncoder().encode("password")).roles("USER")
.and()
.withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
步骤四:使用Spring Security进行用户认证
在步骤三的配置中,我们定义了两个用户,一个是普通用户,另一个是管理员用户。其用户名和密码分别为"user/password"和"admin/password"。我们可以使用如下示例代码来对用户进行认证:
@Service
public class UserService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 根据用户名查询用户
User user = userDao.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("用户不存在");
}
// 将用户信息转换为Spring Security认证对象
List<SimpleGrantedAuthority> authorities = new ArrayList<>();
for (Role role : user.getRoles()) {
authorities.add(new SimpleGrantedAuthority(role.getName()));
}
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);
}
}
在上述代码中,我们定义了一个UserService,实现了UserDetailsService接口,并在loadUserByUsername方法中对用户进行认证。同时,将用户信息转换为Spring Security认证对象,并返回给Spring Security。
步骤五:配置用户角色权限
在步骤三的配置中,我们定义了两个用户的角色权限。
在上述代码中,我们使用了inMemoryAuthentication将用户角色权限写死在代码中。另外,还可以将用户角色权限存储在数据库中,并通过自己实现UserDetailsService接口实现动态查询。
例如,在这里我们可能需要从数据库中查询用户信息:
@Service
public class UserService implements UserDetailsService {
@Autowired
private UserDao userDao;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 根据用户名查询用户
User user = userDao.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("用户不存在");
}
// 将用户信息转换为Spring Security认证对象
List<SimpleGrantedAuthority> authorities = new ArrayList<>();
for (Role role : user.getRoles()) {
authorities.add(new SimpleGrantedAuthority(role.getName()));
}
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);
}
}
@Repository
public interface UserDao extends JpaRepository<User, Integer> {
User findByUsername(String username);
}
上述代码中的UserDao是对用户数据访问层的抽象。
示例一:基于表单的登录验证
基于表单的登录验证是Spring Security中比较常用的一种验证方式。在这种方式下,用户访问受保护的资源时会有一个登录页面弹出,用户输入合法的账号密码后通过验证可以访问。
下面是一个基于表单的登录验证的示例代码。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserService userService;
// 配置过滤器链
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll() // 首页和home可以直接访问
.anyRequest().authenticated() // 其他请求都需要身份认证
.and()
.formLogin()
.loginPage("/login") // 指定登录页面的路径
.permitAll() // 登录页面不需要任何权限
.and()
.logout()
.permitAll(); // 注销请求不需要任何权限
}
// 配置用户认证方式
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userService)
.passwordEncoder(passwordEncoder());
}
// 配置PasswordEncoder
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
上述代码中,我们配置了基本的拦截规则,登录认证,用户角色权限等配置。其中,我们指定了登录页面的路径,任何人都可以访问该页面。而应用中其他受保护的资源则需要进行身份验证。
同时,我们还通过实现UserService的方式,将用户信息存储在了数据库中。
示例二:基于OAuth2的登录验证
OAuth2是Spring Security中比较常用的一种验证方式。它是一个标准的开放协议,允许用户授权访问第三方应用程序,而不需要提供用户名和密码给第三方应用程序。
下面是一个基于OAuth2的登录验证的示例代码。
@SpringBootApplication
@RestController
@EnableOAuth2Client
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@GetMapping("/")
public String home(Principal principal) {
return "Hello, " + principal.getName();
}
@GetMapping("/login")
public String login() {
return "redirect:/oauth2/authorization/google";
}
}
@Configuration
@EnableAuthorizationServer
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("clientId")
.secret(passwordEncoder.encode("secret"))
.authorizedGrantTypes("authorization_code")
.scopes("read")
.redirectUris("http://localhost:8080/login/oauth2/code/google");
}
}
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.oauth2Login()
.loginPage("/login")
.defaultSuccessURL("/")
.permitAll();
}
}
@Configuration
public class OAuth2LoginConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.requestMatchers()
.antMatchers("/login", "/oauth2/authorization/google")
.and()
.authorizeRequests()
.antMatchers("/login", "/oauth2/authorization/google").permitAll()
.anyRequest().authenticated()
.and()
.oauth2Login()
.loginPage("/login")
.defaultSuccessURL("/")
.permitAll();
}
}
上述代码中,我们通过实现@RestController类和自定义配置类实现了OAuth2授权登录。
在Authorization Server中,我们定义了客户端ID和密码,并指定了授权类型、作用域和重定向URI。
在WebSecurityConfigurerAdapter类中,我们定义了拦截规则,指定了OAuth2登录页面的路径和回调地址 。
在ResourceServerConfigurerAdapter类中,我们指定了访问受保护资源时需要的权限。
综上所述,通过上述示例代码和详细步骤,你可以学习Spring Boot如何使用Spring Security进行安全控制。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot如何使用Spring Security进行安全控制 - Python技术站