Spring Boot中使用 Spring Security 构建权限系统的示例代码

下面是详细讲解“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技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 关于Apache默认编码错误 导致网站乱码的解决方案

    关于Apache默认编码错误 导致网站乱码的解决方案 问题描述 当在Apache服务器上部署网站时,如果网页中含有非英文字符,有时会出现乱码的情况,这是因为Apache服务器默认使用ISO-8859-1编码,而网页可能是采用UTF-8等编码格式。 解决方案 出现这种情况时,可以通过修改Apache服务器的配置文件httpd.conf来解决乱码问题。 打开ht…

    Java 2023年5月20日
    00
  • jsp中页面间传汉字参数转码的方法

    在JSP中传递汉字参数可能会出现乱码问题,这是因为浏览器和服务器之间默认采用的字符集不同。为了解决这个问题,我们可以采用如下的方法进行解决。 一、设置请求和响应的编码方式 可以在JSP页面中设置请求和响应的编码方式,代码如下: <%@ page language="java" contentType="text/html;…

    Java 2023年6月15日
    00
  • java中的Io(input与output)操作总结(二)

    下面我来详细讲解 “java中的Io(input与output)操作总结(二)” 的完整攻略。 Io简介 在 Java 中,Io 就是输入和输出操作。常用的 Io 操作包含文件流、输入流、输出流等。在本攻略中,我们主要关注文件流、输入流、输出流的使用。 文件流 文件流用于操作文件,常用的文件流有文件输入流 FileInputStream 和文件输出流 Fil…

    Java 2023年5月26日
    00
  • java 中 System.out.println()和System.out.write()的区别

    Java 中 System 类提供了输出字符流的功能,其中 System.out 对象可以输出到标准输出流。在这个对象中,有两个常见的方法是 System.out.println() 和 System.out.write(),本文将详细讲解它们之间的区别以及使用场景和示例。 System.out.println() 和 System.out.write() …

    Java 2023年5月26日
    00
  • Spring MVC之WebApplicationContext_动力节点Java学院整理

    Spring MVC之WebApplicationContext 本篇攻略将详细讲解Spring MVC框架中的WebApplicationContext,帮助大家了解WebApplicationContext的作用、用法以及注意事项等内容。 什么是WebApplicationContext WebApplicationContext是Spring MVC框…

    Java 2023年6月16日
    00
  • java实现dijkstra最短路径寻路算法

    下面是Java实现Dijkstra最短路径寻路算法的完整攻略: 什么是Dijkstra最短路径寻路算法 Dijkstra算法是一种可以求解带权重图(有向或无向)中的最短路径的算法。该算法要求图的权重为非负值。 Dijkstra算法实现思路 首先我们需要初始化:所有点的到起点的距离为无穷大,但起点到自己的距离为0。 然后从起点开始,将起点标记为已访问过,并将其…

    Java 2023年5月19日
    00
  • SpringBoot热重启配置详解

    Spring Boot热重启是指在开发过程中,修改代码后无需手动重启应用程序,而是自动重新加载修改后的代码并更新应用程序。这大大提高了开发效率。下面是Spring Boot热重启的配置详解: 1. 使用Spring Boot DevTools实现热重启 Spring Boot DevTools是Spring Boot提供的一个开发工具,其中包含了热重启功能。…

    Java 2023年5月14日
    00
  • Apache Log4j2 报核弹级漏洞快速修复方法

    下面是Apache Log4j2报核弹级漏洞快速修复方法的详细攻略: 概述 Apache Log4j2是一个广泛使用的Java日志框架,近日被爆出一个核弹级的漏洞CVE-2021-44228。攻击者在网络上可以通过构造Payload,远程执行任意代码,进行拦截、篡改和窃取敏感信息等攻击。此次漏洞严重性极高,Apache官方已经发布了修复方案,建议尽快进行修复…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部