SpringBoot 整合Security权限控制的初步配置

yizhihongxing

下面是 “SpringBoot 整合Security权限控制的初步配置”的完整攻略,包含了基础概念、示例程序与注意事项。

1. 简介

  • Spring Security 是一个安全框架,提供了认证、授权、攻击防护等一系列的安全功能,是目前比较流行的开源 Java 安全框架之一。

  • Spring Security 采用基于过滤器的方式实现安全控制,对 URL 进行拦截,基于角色、用户认证等更为复杂的信息,进行权限判断。

  • Spring Security 在 Spring Boot 中的整合非常简单,只需要引入关于 Spring Security 的依赖即可。

2. 简单示例

2.1 创建一个 Spring Boot 应用,并引入 spring-boot-starter-security 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2.2 禁用 CSRF

默认情况下,Spring Security 会启用 CSRF 防御。可以在应用程序配置类中禁用:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
    }
}

2.3 配置用户

Spring Security 提供了一个在内存中定义认证用户的功能。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 定义认证用户的功能,在内存中配置用户的账号、密码、角色。
     * @param auth
     * @throws Exception
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("admin").password("123456").roles("ADMIN");
    }
}

通过上述代码可以在内存中配置一个用户名为 admin,密码为 123456,角色为 ADMIN 的用户。

2.4 测试

现在运行应用程序,在浏览器中打开链接 http://localhost:8080,会发现 403 错误。这是因为访问受限,需要进行身份验证。

在弹出的登录框中输入刚刚配置的用户名和密码进行登录。接下来访问 http://localhost:8080 将会直接报错,因为您没有访问该页面的权限。

如果访问 http://localhost:8080/hello,则会出现“Hello World!”的提示信息。这是因为访问 /hello 路径的页面不属于受限资源。

3. 复杂示例

上述示例中,我们配置了一个简单的用户名密码认证,现在我们将配置更复杂的例子:用户使用用户名和密码进行身份验证,如果验证成功,则跳转到首页。如果验证失败,则将其重定向到错误页面。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 数据库授权
     */
    @Autowired
    private UserService userService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService)
                .passwordEncoder(new BCryptPasswordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin().loginPage("/login")
                .and()
                .authorizeRequests()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and()
                .logout().permitAll();
    }
}

上述代码中,我们使用 userService 加载用户并加密密码。接下来我们配置了 /login 的登录页面并将其提供给所有人。我们还配置了任何需要验证的请求,必须具有身份验证。我们还允许注销操作,并且任何人都可以执行此操作。

我们还可以实现 UserService 的代码来自定义欲授权的用户:

@Service
public class UserServiceImpl implements UserDetailsService {

    /**
     * 此处主要为了便于演示,所以将用户密码直接写在代码中。
     * 当然,在实际项目开发中,我们会通过注册功能注册用户,然后将用户的加密后的密码存入数据库中。
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Collection<GrantedAuthority> authorities = new ArrayList<>();
        if ("admin".equals(username)) {
            authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
            return new User("admin", new BCryptPasswordEncoder().encode("123456"), authorities);
        }
        throw new UsernameNotFoundException("用户名不存在!");
    }
}

UserService 中的 UserDetails 对象是 Spring Security 中用于存储用户信息的对象,其中包含了用户认证信息和授权信息。

4. 注意事项

Spring Security 的整合不局限于此,此处仅为初步配置过程的简述。

  1. 默认情况下,Spring Security 在所有 URL 上启用了 CSRF 防御。在页面上使用 CSRF token,或者在 Spring Security 中禁用 CSRF 防御。

  2. 默认情况下,Spring Security 具有防止会话固定漏洞的功能。这意味着每次登录成功后,会话 ID 会被更改。如果您的应用程序需要允许来自相同 IP 地址的串行用户,则可能需要禁用此保护。

  3. 匹配通配符时 /** 表示任意路径,而/* 表示单层路径,例如 /foo/* 将匹配 /foo/bar,但是不匹配 /foo/bar/baz。

  4. 本文中提到的示例代码为了方便说明信息的整合过程,违背了最佳实践中加密算法不应该加在 Java 代码中使用的原则,实际项目中请勿这样使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot 整合Security权限控制的初步配置 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 利用Java实现文件锁定功能

    接下来我将为你详细讲解如何利用Java实现文件锁定功能。 什么是文件锁定 文件锁定是指在对文件进行读取、修改等操作时,防止其他程序或者线程对同一文件进行操作,从而避免文件被多个程序同步修改而产生数据不一致的情况。 文件锁定的实现原理 文件锁定的实现原理是通过创建文件锁的方式来阻止其他程序访问被锁定的文件。在Java中,可以通过FileChannel类创建文件…

    Java 2023年5月20日
    00
  • Java Hibernate中一对多和多对多关系的映射方式

    Java Hibernate是Java平台下一个流行的ORM框架,可以帮助我们将Java对象关系映射到关系型数据库中。在实际应用中,经常需要处理一对多和多对多的关系,例如一个用户可以拥有多个角色,一个订单可以包含多种商品等等。这时我们需要用到Hibernate中的一对多和多对多关系的映射。 一对多关系的映射 一对多的关系 在数据库中,一对多关系通常是通过外键…

    Java 2023年5月19日
    00
  • 一文读懂JAVA中HttpURLConnection的用法

    一文读懂JAVA中HttpURLConnection的用法 HttpURLConnection是Java中用于远程调用HTTP服务的类,支持HTTP/HTTPS协议,并提供了GET、POST、PUT等常见HTTP方法。 HttpURLConnection的使用步骤 创建一个URL对象,指向需要访问的URL地址。 打开连接对象,并设置请求方法,设置是否允许输出…

    Java 2023年6月15日
    00
  • Mybatis Plus使用XML编写动态sql的超简易方法

    下面详细讲解”Mybatis Plus使用XML编写动态SQL的超简易方法”。 简介 Mybatis Plus是Mybatis的增强工具,可以用来简化Mybatis的开发。Mybatis Plus默认使用了entity的字段映射表中的字段,但是在实际开发过程中,我们经常会遇到重用entity映射表中同一个字段做不同的条件查询的情况,这时候我们就需要用XML来…

    Java 2023年5月20日
    00
  • Springboot mybatis plus druid多数据源解决方案 dynamic-datasource的使用详解

    关于“Springboot mybatis plus druid多数据源解决方案 dynamic-datasource的使用详解”的攻略,我会从以下几个方面进行讲解: 什么是多数据源 动态数据源的原理 Springboot mybatis plus druid多数据源解决方案 示例1:在一个Spring Boot项目中使用多数据源 示例2:在一个基于Spri…

    Java 2023年5月20日
    00
  • Ajax读取数据之分页显示篇实现代码

    Ajax是一种在Web应用程序中创建异步请求的技术。本篇攻略将演示如何使用Ajax读取数据并分页显示。 实现步骤 1.后端:编写接口,提供数据。 2.前端:使用Ajax从后端读取数据并展示。 3.前端:实现分页逻辑。 下面是这些步骤的详细说明。 编写接口 我们需要提供一个接口来获取数据。可以使用PHP、Java或任何其他后端编程语言编写接口。下面是一个使用P…

    Java 2023年6月15日
    00
  • java旋转二维数组实例

    Java旋转二维数组实例攻略 在Java中,我们可以使用多种方法来旋转二维数组。下面是一些示例说明。 方法一:使用额外空间 该方法首先将原始矩阵复制到一个新矩阵中,然后对新矩阵进行更改以获得旋转的矩阵。在这种情况下,由于使用了额外空间,因此该方法的空间复杂度为O(m * n)。 代码实现 public int[][] rotateMatrix(int[][]…

    Java 2023年5月26日
    00
  • struts2数据处理_动力节点Java学院整理

    Struts2 数据处理攻略 Struts2 提供了非常方便的数据处理功能,包括表单提交、参数传递、数据封装等。本文将从以下三个方面详细介绍 Struts2 数据处理的攻略: 1.表单提交2.参数传递3.数据封装 表单提交 在 Struts2 中,我们可以通过表单提交的方式向服务器发送请求,并且可以同时将一些参数提交给服务器。具体操作步骤如下: 1.编写 J…

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