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日

相关文章

  • LINQ to XML的编程基础

    LINQ to XML 是用于处理 XML 文档的 API,它允许我们通过 LINQ 查询语言来查询和对 XML 文档进行操作,相比传统 DOM 模型和 SAX 模型的 XML 处理方式,LINQ to XML 更具有灵活性和易用性。下面就是 LINQ to XML 的编程基础攻略: 1. 首先,需要引用相应的命名空间 使用 LINQ to XML,需要引用…

    Java 2023年5月19日
    00
  • Sprint Boot @Profile使用方法详解

    Spring Boot的@Profile注解 在Spring Boot中,@Profile注解用于指定在不同的环境中使用不同的配置。通过使用@Profile注解,可以轻松地在不同的环境中切换配置,例如开发环境、测试环境和生产环境。 @Profile注解的使用方法 以下是@Profile注解的使用方法: 在配置类或配置方法上添加@Profile注解,并指定环境…

    Java 2023年5月5日
    00
  • Spring多个数据源配置详解

    Spring 多数据源配置是在一个应用程序里使用不同的数据源连接数据库,通过配置多个数据源,实现不同模块、不同业务区分对应的数据库连接。下面是详细攻略: 1. 添加依赖 首先在 pom.xml 文件中添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId&g…

    Java 2023年5月20日
    00
  • Java反射简易教程

    下面是Java反射简易教程的完整攻略。 什么是反射? Java是一门静态语言,一般情况下,我们需要在编译时就定义好变量和类的类型。但是有些情况下,我们需要在运行时动态获取或者创建对象,这时候就需要使用反射技术。 Java反射是指程序可以访问、检测和修改它本身的某些属性或者方法,而这些属性或者方法都是在编译时完全未知的,只有在运行时才能确定。Java反射使得我…

    Java 2023年5月26日
    00
  • Sprint Boot @Max使用方法详解

    @Max是Spring Boot中的一个注解,用于标记一个字段或方法参数的值必须小于或等于指定的最大值。在本文中,我们将详细介绍@Max注解的作用和使用方法,并提供两个示例。 @Max注解的作用 @Max注解用于标记一个字段或方法参数的值必须小于或等于指定的最大值。当使用@Max注解标记一个字段或方法参数时,如果该字段或方法参数的值大于指定的最大值,则会抛出…

    Java 2023年5月5日
    00
  • jsp中sitemesh修改tagRule技术分享

    下面我将详细讲解“JSP中Sitemesh修改tagRule技术分享”的完整攻略。 简介 Sitemesh是一款用于Web页面装饰的框架,可以将公共的页面模板与动态生成的内容进行分离。在使用Sitemesh的过程中,可以通过修改tagRule来自定义标签的使用规则,并且可以根据需求进行灵活调整。 修改tagRule的步骤 1. 创建自定义的tagRule 在…

    Java 2023年6月15日
    00
  • Java实现调用MySQL存储过程详解

    下面是关于“Java实现调用MySQL存储过程详解”的完整攻略。 什么是存储过程 存储过程是一组预先编译好的SQL语句集合,存储在数据库中,可以在需要时被调用执行。存储过程可以接受参数并返回数据,被广泛应用于数据处理和业务流程中,广泛使用于各种数据库系统中。 Java如何调用MySQL存储过程 Java程序可以通过调用JDBC API中提供的方法来调用MyS…

    Java 2023年5月19日
    00
  • Java中网络IO的实现方式(BIO、NIO、AIO)介绍

    Java中网络IO的实现方式主要有BIO、NIO、AIO三种。下面分别进行介绍。 BIO BIO即Blocking IO,阻塞式IO,是一种传输方式。BIO的特点是同步阻塞,也就是说,客户端请求到来后,服务器必须处理完该请求才能执行下一步操作,高并发下无法满足需求。使用BIO方式,可以使用Socket和ServerSocket类进行通信。 下面是一个BIO的…

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