一文详解Spring security框架的使用
Spring Security是一个基于Spring框架实现的权限管理框架,支持基于角色的访问控制和安全性方面的许多其他功能,如认证、授权等等。本文将对Spring Security的使用进行详细讲解。
Spring Security的配置
在使用Spring Security之前,首先需要在pom.xml文件中引入依赖,例如:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.0.0.RELEASE</version>
</dependency>
然后,在项目的配置文件中配置Spring Security,例如在Spring Boot项目的application.yml中添加如下配置:
spring:
security:
user:
name: admin
password: 123456
basic:
realm-name: My APP
这里定义了一个用户名为admin,密码为123456的用户,并将realm名称设置为My APP。
Spring Security的使用
基本认证授权
在Spring Security中,可以使用基本HTTP认证和授权功能,例如:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.httpBasic()
.and()
.csrf().disable();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin").password("123456").roles("ADMIN");
}
}
在上面的代码中,配置了一个基本的HTTP认证和授权功能,指定了只有拥有ADMIN角色的用户才能访问/admin路径下的资源。如果用户未经过认证,则会弹出认证框,输入用户名和密码验证身份。
表单登录认证授权
在Web应用中,常用的认证授权方式是通过表单进行的,Spring Security也提供了表单登录的功能,例如:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private DataSource dataSource;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login").failureUrl("/login-error").permitAll()
.and()
.logout().logoutSuccessUrl("/").invalidateHttpSession(true).permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().dataSource(dataSource)
.usersByUsernameQuery("select username,password,enabled from users where username=?")
.authoritiesByUsernameQuery("select username,authority from authorities where username=?")
.passwordEncoder(new BCryptPasswordEncoder());
}
}
在上面的代码中,配置了一个支持表单登录的认证授权功能,可以根据自己的需求自定义登录页面和错误页面,同时也支持注销功能。登录时会自动对输入的用户名和密码进行认证,并根据用户的角色进行授权。
示例
示例1:基本认证授权
下面是一个基于Spring Security的基本认证授权示例,创建了一个/admin路径下的资源,只有拥有ADMIN角色的用户才能访问:
@RestController
public class UserController {
@GetMapping("/admin")
public String helloAdmin() {
return "Hello Admin!";
}
}
启动应用后,访问http://localhost:8080/admin,会弹出认证框,需要输入用户名和密码,正确输入后会看到Hello Admin!的返回结果。
示例2:表单登录认证授权
下面是一个基于Spring Security的表单登录认证授权示例,创建了一个/login路径作为登录页面,以及/logout路径作为注销功能:
@RestController
public class UserController {
@GetMapping("/login")
public String login() {
return "Please login";
}
@GetMapping("/login-error")
public String loginError() {
return "Login error";
}
@GetMapping("/admin")
public String helloAdmin() {
return "Hello Admin!";
}
@GetMapping("/logout")
public String logout(HttpServletRequest request) throws ServletException {
request.logout();
return "Logout success";
}
}
启动应用后,访问http://localhost:8080/admin,会被重定向到http://localhost:8080/login页面,需要输入用户名和密码进行认证,成功后才能访问/admin路径下的资源。当注销时,可以访问/logout路径进行注销操作。
总结
Spring Security是一个很强大的基于Spring框架的权限管理框架,支持基于角色的访问控制和安全性方面的许多其他功能,使用起来也很简单。本文介绍了Spring Security的配置和使用方法,并提供了两个示例给读者参考。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文详解Spring security框架的使用 - Python技术站