SpringBoot整合Security权限控制登录首页

下面我将详细讲解“SpringBoot整合Security权限控制登录首页”的完整攻略,并给出两个示例来帮助理解。

一、准备工作

1.1 引入依赖

首先,我们需要在pom.xml文件中引入相关依赖:

<!-- Spring Security依赖 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- Spring MVC依赖 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

1.2 创建登录页面

src/resources/templates/目录下创建登录页面login.html,代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Login</title>
    <style type="text/css">
        div {
            margin: 10px 0;
        }
    </style>
</head>
<body>
<h1>Login</h1>
<form action="/login" method="post">
    <div>
        <label>Username:</label>
        <input type="text" name="username">
    </div>
    <div>
        <label>Password:</label>
        <input type="password" name="password">
    </div>
    <div>
        <input type="submit" value="Login">
    </div>
</form>
</body>
</html>

1.3 配置安全策略

src/main/java/目录下创建SecurityConfig.java文件,代码如下:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 配置用户数据和权限
        auth.inMemoryAuthentication()
            .withUser("admin").password("{noop}admin").roles("ADMIN")
            .and()
            .withUser("user").password("{noop}user").roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/index").permitAll() // 不需要权限访问的页面
                .anyRequest().authenticated() // 其他页面必须登录才能访问
                .and()
            .formLogin()
                .loginPage("/login") // 指定登录页面的url
                .defaultSuccessUrl("/index") // 登录成功之后跳转的url
                .permitAll() // 登录页面不需要权限访问
                .and()
            .logout()
                .logoutUrl("/logout") // 注销的url
                .permitAll(); // 注销页面不需要权限访问
    }
}

二、示例1:普通用户访问需要ADMIN权限的页面

我们来看一个示例:普通用户访问需要ADMIN权限的页面。在src/main/java/目录下创建IndexController.java文件,代码如下:

@Controller
public class IndexController {

    @GetMapping("/index")
    public String index() {
        return "index";
    }

    @GetMapping("/admin")
    @ResponseBody
    public String admin() {
        return "Hello, admin!";
    }

    @GetMapping("/user")
    @ResponseBody
    public String user() {
        return "Hello, user!";
    }
}

现在我们来模拟一下普通用户访问/admin页面的情景。首先,我们需要在SecurityConfig中配置相应的权限:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/", "/index").permitAll()
            .antMatchers("/admin/**").hasRole("ADMIN") // 需要ADMIN权限才能访问
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .defaultSuccessUrl("/index")
            .permitAll()
            .and()
        .logout()
            .logoutUrl("/logout")
            .permitAll();
}

接下来我们再来编写一个测试用例来测试一下:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class IndexControllerTest {

    @Autowired
    private WebApplicationContext context;

    private MockMvc mockMvc;

    @Before
    public void setUp() {
        mockMvc = MockMvcBuilders
            .webAppContextSetup(context)
            .apply(SecurityMockMvcConfigurers.springSecurity()) // 开启Security模拟器
            .build();
    }

    @Test
    public void adminTest() throws Exception {
        mockMvc.perform(get("/admin"))
            .andExpect(status().isForbidden()); // 访问/admin时应返回403 Forbidden
    }
}

通过测试用例可以看出,普通用户访问/admin页面时返回了403 Forbidden状态码,符合我们的期望。

三、示例2:管理员访问需要ADMIN权限的页面

我们再来看一个示例:管理员访问需要ADMIN权限的页面。在SecurityConfig中配置管理员角色:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
        .withUser("admin").password("{noop}admin").roles("ADMIN") // 管理员角色
        .and()
        .withUser("user").password("{noop}user").roles("USER");
}

然后我们来编写一个测试用例来测试一下:

@Test
public void adminTest() throws Exception {
    mockMvc.perform(get("/admin").with(user("admin").roles("ADMIN")))
        .andExpect(status().isOk()) // 访问/admin时应返回200 OK
        .andExpect(content().string("Hello, admin!")); // 正确执行
}

通过测试用例可以看出,管理员访问/admin页面时返回了200 OK状态码,并且执行了正确的操作,符合我们的期望。

四、总结

通过以上示例,我们可以看出,通过SpringBoot整合Security可以很方便地实现权限控制和登录功能。需要注意的是,Spring Security提供的默认的登录页面虽然可以使用,但是需要在代码中进行配置,否则无法生效。因此,对于自定义的登录页面,需要使用.loginPage()方法进行指定。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot整合Security权限控制登录首页 - Python技术站

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

相关文章

  • Java Apache POI报错“EmptyFileException”的原因与解决办法

    “EmptyFileException”是Java的Apache POI类库中的一个异常,通常由以下原因之一引起: 空文件:如果文件为空,则可能会出现此异常。例如,可能会尝试打开一个空的Excel文档。 以下是两个实例: 例1 如果文件为空,则可以尝试检查文件是否存在以解决此问题。例如,在Java中,可以使用以下代码: File file = new Fil…

    Java 2023年5月5日
    00
  • Java反射 PropertyDescriptor类案例详解

    “Java反射 PropertyDescriptor类案例详解”中,主要是对Java反射中的PropertyDescriptor类进行讲解,该类主要是用于访问JavaBean类的属性信息(就是通过get、set方法设置的属性),并可以会根据JavaBean对象来调用对应属性的get、set方法。下面详细介绍该攻略的完整过程。 1. PropertyDescr…

    Java 2023年6月15日
    00
  • Spring MVC传递接收参数方式小结

    接下来我将详细讲解“Spring MVC传递接收参数方式小结”的完整攻略。 Spring MVC传递接收参数方式小结 Spring MVC是一种基于Java的Web框架,它提供了一种使用 POJO(Plain Old Java Object)作为控制器的方式来开发Web应用。在Spring MVC中,控制器方法(Controller方法)可以使用多种方式来接…

    Java 2023年6月15日
    00
  • Java实现Fibonacci(斐波那契)取余的示例代码

    下面是Java实现Fibonacci取余的示例代码完整攻略。 什么是斐波那契数列 斐波那契数列是指这样一个数列:0、1、1、2、3、5、8、13、21、34、……。这个数列从第3项开始,每一项都等于前两项之和。 如何实现取余功能 通过取余运算,可以有效地提高程序的效率,避免计算数值过大而发生数据溢出的情况。 在Java中,可以通过取模(%)运算符来实现取余操…

    Java 2023年5月18日
    00
  • Java日常练习题,每天进步一点点(4)

    Java日常练习题每天进步一点点(4)的完整攻略如下: 1. 题目描述 本题共有两道小题: 题目1:设计一个验证码,验证码中包含字母和数字,并且验证码的长度为6位。 题目2:设计一个判断两个字符串是否可变换而成的函数,例如:输入字符串abc和bca,输出true。 2. 解题思路 题目1 设计验证码需要随机生成字母和数字,并且验证码的长度为6位。可以使用以下…

    Java 2023年5月20日
    00
  • SpringBoot特点之依赖管理和自动装配(实例代码)

    SpringBoot特点之依赖管理和自动装配(实例代码) 依赖管理 Spring Boot的依赖管理采用了“约定优于配置”的原则,省去了繁琐的依赖配置。Spring Boot通过Starter POMs来管理依赖,Starter POMs是一种特殊的POM文件,包含了一系列相关的依赖,我们只需要添加相应的Starter POM,即可快速地集成一些常用的依赖。…

    Java 2023年5月15日
    00
  • 一小时迅速入门Mybatis之增删查改篇

    一小时迅速入门Mybatis之增删查改篇 Mybatis是一款优秀的ORM框架,其简单易用,功能强大,得到了广大开发者的喜爱。本文将为大家介绍使用Mybatis进行增删查改的完整攻略。 1. 环境准备 Mybatis需要依赖JDBC驱动和数据库连接池,建议使用Maven进行管理。这里我们以MySQL为例,展示如何配置环境。 首先在pom.xml文件中添加以下…

    Java 2023年5月20日
    00
  • Maven打包jar生成javadoc文件和source文件代码实例

    接下来将为您详细讲解”Maven打包jar生成javadoc文件和source文件代码实例”的完整攻略。 1. 前置条件 在进行生成javadoc文件和source文件代码之前,需要确保本机已经安装了JDK和Maven。 2. 创建Maven项目 在本地创建一个Maven项目并在其中添加需要进行打包的代码。 <project xmlns="h…

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