下面是详细讲解“Spring Boot中使用 Spring Security 构建权限系统的示例代码”的完整攻略,包含了两条示例:
1. 构建Spring Boot项目
首先,我们需要构建一个Spring Boot项目,可以使用Maven或Gradle来管理依赖并生成项目文件。
在项目中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. 配置Spring Security
在src/main/java下新建一个SecurityConfiguration类,并加上@Configuration和@EnableWebSecurity注解,如下所示:
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();
}
}
configure(HttpSecurity http)方法用于配置Spring Security的权限相关参数。这个例子中,我们指定任何请求都需要进行身份验证,并使用基本的表单登录方式进行验证。
3. 创建UserDetailsService
在src/main/java下新建一个UserDetailsServiceImpl类,并实现UserDetailsService,如下所示:
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if (username.equals("admin")) {
return new User("admin", "{noop}123456", new ArrayList<>());
} else {
throw new UsernameNotFoundException("User not found with username: " + username);
}
}
}
在这个例子中,我们使用了一个简单的用户名和密码来进行身份验证,并使用了“NoOpPasswordEncoder”来加密密码。在实际应用中,应该使用更加安全的加密方式。
4. 处理Spring Security未授权的访问
在src/main/java下新建一个RestAuthenticationEntryPoint类,并继承Http403ForbiddenEntryPoint类,如下所示:
@Component
public class RestAuthenticationEntryPoint extends Http403ForbiddenEntryPoint {
}
这个类的目的是处理Spring Security未授权的访问,返回403 Forbidden错误信息。
5. 处理Spring Security授权失败的访问
在src/main/java下新建一个RestAccessDeniedHandler类,并实现AccessDeniedHandler,如下所示:
@Component
public class RestAccessDeniedHandler implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access denied");
}
}
这个类的目的是处理Spring Security授权失败的访问,返回403 Forbidden错误信息。
6. 创建Controller
在src/main/java下新建一个HelloController类,并添加@RestController和@RequestMapping注解,如下所示:
@RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping("/admin")
@PreAuthorize("hasRole('ADMIN')")
public String admin() {
return "Hello Admin";
}
@GetMapping("/user")
@PreAuthorize("hasRole('USER')")
public String user() {
return "Hello User";
}
}
这个类用于处理请求,其中admin()和user()方法使用@PreAuthorize注解进行权限控制,只有拥有对应角色的用户才能访问。
7. 运行项目
现在,我们已经完成了Spring Security权限系统的配置。可以启动项目,并尝试访问“/hello/admin”和“/hello/user”路径,查看权限控制是否有效。
8. 示例1:添加新用户
现在,我们来添加一个新用户,并赋予ADMIN角色。
可以在UserDetailsServiceImpl的loadUserByUsername()方法中添加如下代码:
if (username.equals("newuser")) {
return new User("newuser", "{noop}123456", Collections.singletonList(new SimpleGrantedAuthority("ROLE_ADMIN")));
}
现在,我们已经添加了一个新用户,并给它赋予了ADMIN角色。可以使用这个新用户的用户名和密码进行登录和验证。
9. 示例2:定制登录界面
Spring Security提供了许多默认的登录界面,但我们也可以通过定制来使这个界面更加符合项目的主题需求。
可以在SecurityConfiguration类中添加如下代码:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().httpBasic().and().exceptionHandling().authenticationEntryPoint(new RestAuthenticationEntryPoint()).accessDeniedHandler(new RestAccessDeniedHandler());
}
在上面的代码中,我们指定了一个自定义的登录界面路径“/login”,并给这个路径添加了需要的权限和验证。
可以在src/main/resources/static下新建一个login.html文件,用于展示自定义的登录界面。适当地添加样式和脚本,可以使它更美观和实用。
参考文献:
[1] Spring Boot Security Example – UserDetailsService and Role-based Authentication
[2] Spring Security Custom Login Form Example
以上就是“Spring Boot中使用 Spring Security 构建权限系统的示例代码”的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot中使用 Spring Security 构建权限系统的示例代码 - Python技术站