下面是关于Spring Security全新版本使用方式的完整攻略:
什么是Spring Security?
Spring Security是一个强大且可高度自定义的框架,用于身份验证和授权。它基于Servlet过滤器,可以轻松地将安全性添加到Web应用程序中。
如何使用Spring Security?
步骤一:添加Spring Security依赖
首先,在您的项目中添加Spring Security依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.3.5.RELEASE</version>
</dependency>
步骤二:配置Spring Security
其次,配置Spring Security以保护您的Web应用程序。您可以使用Java或XML配置进行配置。以下是一个Java配置示例:
@Configuration
@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private MyUserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
}
在上述配置中:
@EnableWebSecurity
:用于启用Web安全性configure(HttpSecurity http)
:用于配置如何保护Web应用程序configure(AuthenticationManagerBuilder auth)
:用于配置身份验证管理器
步骤三:提供用户详细信息
接下来,您需要提供用户详细信息以进行身份验证。您可以使用默认的UserDetails
或实现自己的UserDetails
接口,并使用自定义的用户细节服务来查找和验证用户。以下是一个自定义用户细节服务的示例:
@Service
public class MyUserDetailsService 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.");
}
List<GrantedAuthority> 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);
}
}
在上述示例中,MyUserDetailsService
实现了UserDetailsService
接口,该接口负责查找用户详细信息并返回一个UserDetails
对象。在该示例中,我们使用UserRepository
来查找用户。根据我们的数据模型,用户可以具有多个角色,因此我们需要将每个角色转换为GrantedAuthority
对象并将其提供给UserDetails
对象。
步骤四:编写用户登录和注销代码
最后,编写用户登录和注销代码以与Spring Security进行交互。以下是基于Spring MVC的登录和注销示例:
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password, RedirectAttributes redirectAttributes) {
try {
Authentication authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
SecurityContextHolder.getContext().setAuthentication(authentication);
return "redirect:/home";
} catch (AuthenticationException ex) {
redirectAttributes.addAttribute("error", ex.getMessage());
return "redirect:/login";
}
}
@PostMapping("/logout")
public String logout() {
SecurityContextHolder.getContext().setAuthentication(null);
return "redirect:/login";
}
在上述示例中,我们使用AuthenticationManager
进行身份验证,该身份验证管理器将委托给我们之前定义的MyUserDetailsService
类来查找和验证用户详细信息。在成功的身份验证之后,我们使用SecurityContextHolder
将Authentication
对象设置为安全上下文中的当前身份验证。
示例一:使用Spring Security在Spring Boot中保护Web应用程序
下面是一个简单的示例,演示如何使用Spring Security在Spring Boot中保护Web应用程序。这个示例假设您已经安装并配置了Spring Boot并使用Thymeleaf作为模板引擎。
步骤一:创建Spring Boot项目
首先,使用Spring Initializr创建一个新Spring Boot项目。只需选择您喜欢的构建工具和依赖关系(在这种情况下,选择Thymeleaf作为模板引擎)。
步骤二:添加Spring Security依赖
其次,添加Spring Security依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
步骤三:创建Web页
接下来,创建一个简单的Web页,并呈现“Hello World!”消息。您可以使用以下内容创建一个名为home.html
的新页面:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Home</title>
</head>
<body>
<h1 th:text="'Hello, ' + ${userName} + '!'"></h1>
<form th:action="@{/logout}" method="post">
<input type="submit" value="Logout"/>
</form>
</body>
</html>
在上述页面中,我们将使用Thymeleaf模板引擎呈现userName
变量的值,并提供一个简单的表单,用户可以使用该表单注销。
步骤四:创建Spring Security配置
然后,创建一个Spring Security配置,以保护我们的Web应用程序并进行身份验证。您可以使用以下Java配置:
@Configuration
@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password("{noop}password").roles("USER");
}
}
在上述配置中,我们定义了一个具有用户名“user”和密码“password”的用户,并对所有请求进行身份验证(除了“/login”)。管理员可以使用以下命令创建另一个用户:
auth.inMemoryAuthentication()
.withUser("admin").password("{noop}password").roles("ADMIN");
步骤五:创建登录和注销控制器
最后,创建登录和注销控制器,以允许用户进行身份验证并注销。您可以使用以下内容创建一个新的控制器:
@Controller
public class MyController {
@GetMapping("/")
public String home(Model model) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String name = auth.getName();
model.addAttribute("userName", name);
return "home";
}
@GetMapping("/login")
public String login() {
return "login";
}
@PostMapping("/login")
public String doLogin() {
return "redirect:/";
}
@PostMapping("/logout")
public String logout() {
return "redirect:/login?logout";
}
}
在上述控制器中,我们定义了以下操作:
@GetMapping("/")
:用于呈现我们的主页。我们从安全上下文中获取当前用户名,并将其添加到模型中,使其可供Thymeleaf使用。@GetMapping("/login")
:用于呈现登录页面。@PostMapping("/login")
:用于在认证后重定向到主页。@PostMapping("/logout")
:用于注销用户并重定向到登录页面。
示例二:使用Spring Security REST API保护Web服务
下面是一个简单的示例,演示如何使用Spring Security REST API保护Web服务。
步骤一:创建Spring Boot项目
首先,与之前相同,使用Spring Initializr创建一个新的Spring Boot项目,并选择您喜欢的构建工具。
步骤二:添加Spring Security依赖
其次,添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-jose</artifactId>
</dependency>
步骤三:创建REST API控制器
接下来,创建一个REST API控制器,用于提供您的Web服务。以下是一个示例:
@RestController
@RequestMapping("/api")
public class MyApiController {
@GetMapping("/hello")
public String hello() {
return "Hello world!";
}
}
在上述示例中,我们定义了一个简单的GET方法,用于返回“Hello World!”消息。
步骤四:配置Spring Security
然后,配置Spring Security以保护我们的Web服务。以下是一个Java配置示例:
@Configuration
@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/**").authenticated()
.and()
.oauth2ResourceServer()
.jwt()
.decoder(JwtDecoders.fromOidcIssuerLocation("https://your-oidc-issuer.com"));
}
@Bean
public JwtDecoder jwtDecoder() {
return JwtDecoders.fromOidcIssuerLocation("https://your-oidc-issuer.com");
}
}
在上述示例中,我们定义了以下操作:
configure(HttpSecurity http)
:用于配置Spring Security如何保护我们的Web服务。我们定义了一个地址模式以保护Web服务,要求所有请求都需要身份验证。oauth2ResourceServer().jwt()
:用于指定我们将使用JSON Web令牌来保护我们的Web服务。decoder(JwtDecoders.fromOidcIssuerLocation("https://your-oidc-issuer.com"))
:用于指定解码我们的JSON Web令牌使用的密钥。您应该将其更改为您的实际OIDC发行者位置。
步骤五:创建JWT生成器
最后,创建一个JWT生成器(或使用现有的),用于生成JSON Web令牌,该令牌用于身份验证。以下是一个示例:
@Service
public class JwtGenerator {
public String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();
claims.put("sub", userDetails.getUsername());
claims.put("iat", new Date().getTime() / 1000);
claims.put("exp", new Date().getTime() / 1000 + 120);
return Jwts.builder()
.setClaims(claims)
.signWith(SignatureAlgorithm.HS256, "secret")
.compact();
}
}
在上述示例中,我们定义了以下操作:
generateToken(UserDetails userDetails)
:用于生成包含以下声明的新JSON Web令牌:- “sub”:用户的用户名
- “iat”:JWT的发行时间
- “exp”:JWT的过期时间
signWith(SignatureAlgorithm.HS256, "secret")
:用于使用HS256算法并使用密钥“secret”签署我们的JWT。
总结
在上述两个示例中,我们演示了如何使用Spring Security保护Web应用程序和Web服务。学会了这些,您应该能够在您的应用程序中轻松地添加基本安全性,以确保只有经过身份验证的用户可以访问您的功能和资源。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Security全新版本使用方式 - Python技术站