关键词

SpringBoot2.0 整合 SpringSecurity 框架实现用户权限安全管理方法

下面我将详细讲解“SpringBoot2.0 整合 SpringSecurity 框架实现用户权限安全管理方法”的完整攻略。在过程中,我将提供两条示例。

1. 简介

Spring Security 是一个基于 Spring 框架提供的安全解决方案之一。它提供了一种简单易用的方式来实现身份认证(Authentication)和授权(Authorization)。

Spring Boot 是 Spring 家族中的一员,它提供了一种快速开发的方式,能够自动化很多繁琐的配置。Spring Boot 2.0 是 Spring Boot 的最新版本,相比较于 1.x 版本来说,更加注重对于 Web 服务微服务化的支持,其中整合 Spring Security 也有了很大的更新和改进。

2. 整合 SpringSecurity 的基本步骤

第一步:添加 Spring Security 依赖

在 Spring Boot 2.0 中,我们可以直接添加以下 Maven 依赖来引入 Spring Security:

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

添加该依赖后,我们就可以开始使用 Spring Security 安全框架了。

第二步:编写 Spring Security 配置类

想要实现用户权限管理,我们需要定制化 Spring Security 配置。我们可以通过继承 WebSecurityConfigurerAdapter 类,并重写它的 configure 方法来定制化配置。我们通常会在配置类里面设置需要登录的用户账号密码、用户角色权限等信息。

下面的示例中,我们创建了一个名为 SecurityConfig 的配置类,用来控制 Spring Security 的用户认证和授权。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests() // 开启请求授权认证
                .antMatchers("/", "/home").permitAll() // 不需要任何认证即可访问
                .anyRequest().authenticated() // 其他请求需要认证
                .and()
            .formLogin() // 开启表单登录认证
                .loginPage("/login") // 自定义登录页面路径
                .permitAll()
                .and()
            .logout() // 开启退出登录认证
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .inMemoryAuthentication() // 在内存中进行用户认证
                .withUser("user").password("{noop}password").roles("USER") // 这个用户具有 USER 权限
                .and()
                .withUser("admin").password("{noop}password").roles("USER", "ADMIN"); // 这个用户同时具有 USER 和 ADMIN 权限
    }
}

在上面的代码中,我们使用了 authorizeRequests 来开启请求授权认证,并设置了 antMatchers 来匹配需要授权的请求。我们把 "/" 和 "/home" 路径设置为不需要任何认证即可访问,其他请求则需要认证才能访问。我们还开启了表单登录和退出登录认证,并在内存中进行用户认证。

需要注意的一点是,我们在代码中的密码是明文方式存储的,这是为了方便演示。实际开发中应该采用加密方式存储密码,避免密码泄露和安全问题。

第三步:配置 SpringBoot 应用的 application.properties 文件

我们必须在 application.properties 文件中设置一些配置信息才能让 Spring Security 配置对我们的应用产生影响。下面是一个 application.properties 文件的示例:

# 设置应用名称
spring.application.name=SpringSecurityDemo
# 设置应用端口号
server.port=8080
# 关闭 security 的默认配置
security.basic.enabled=false
# 关闭 CSRF 防御
spring.security.csrf.enabled=false

# 设置登录名和密码
spring.security.user.name=user
spring.security.user.password=password

这里我们将 CSRF 防御设置为关闭了,这样在进行开发的时候会比较方便。实际开发中应该启用 CSRF 防御来提高应用的安全性。

第四步:编写控制器

最后一步是编写一个控制器,用来处理 URL 请求。我们创建一个 HomeController 类,用来处理主页面相关的请求。下面是示例代码:

@Controller
public class HomeController {

    @RequestMapping(value = "/")
    public String index() {
        return "index";
    }

    @RequestMapping(value = "/home")
    public String home() {
        return "home";
    }

    @RequestMapping(value = "/login")
    public String login() {
        return "login";
    }

}

以上代码中,分别定义了三个 URL,分别是 /、/home 和 /login。/ 和 /home 对应的是主页面,/login 对应的是登录页面。

3. 示例

下面提供两个示例供参考:

示例一:基于角色的权限访问控制

在上面的示例中,我们配置了两个用户,user 和 admin。其中,admin 用户具有 USER 和 ADMIN 权限,而 user 用户只有 USER 权限。

如果我们希望只有具有 ADMIN 权限的用户才能访问例如 /admin 这样的路径,该如何配置呢?我们可以根据角色来控制权限访问。示例代码如下:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .antMatchers("/admin/**").hasRole("ADMIN") // 这个路径需要 ADMIN 角色才能访问
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .inMemoryAuthentication()
                .withUser("user").password("{noop}password").roles("USER")
                .and()
                .withUser("admin").password("{noop}password").roles("USER", "ADMIN");
    }
}

示例二:基于数据库的认证授权

我们可以将用户权限信息存储在数据库中,实现基于数据库的认证和授权。示例代码如下:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

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

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .jdbcAuthentication()
                .dataSource(dataSource)
                .usersByUsernameQuery("select username,password,enabled from users where username=?")
                .authoritiesByUsernameQuery("select username,authority from authorities where username=?");
    }
}

在这个示例中,我们将用户认证和授权的信息存储在了数据库中。其中,users 表用来存储用户的基本信息,authorities 表用来存储用户的权限信息。

以上就是整合 Spring Security 框架实现用户权限安全管理的完整攻略,希望对您有所帮助!

本文链接:http://task.lmcjl.com/news/13048.html

展开阅读全文