springsecurity轻松实现角色权限的示例代码

yizhihongxing

下面详细讲解“springsecurity轻松实现角色权限的示例代码”的完整攻略。

什么是Spring Security

Spring Security是一个基于Spring框架的安全框架,它提供了一种安全性配置,可以处理认证(用户身份验证)和授权(用户访问控制)。通过它,我们可以轻松实现角色权限的管理。

Spring Security的基本概念

在使用Spring Security时,我们需要理解几个基本概念:

  • 用户(User):标识一个拥有访问系统能力的个体。在系统中,用户通常通过唯一标识的用户名进行标识。
  • 身份(Principal):身份代表用户在系统中的一种识别方式,可以是用户名,也可以是其他信息,例如电子邮件地址或手机号码。
  • 凭证(Credential):用户凭证用于验证用户的身份。通常,凭证是用户输入系统的密码,但也可以是其他机制。
  • 认证(Authentication):认证是指通过验证凭证的方式来确认身份。
  • 权限(Authority):权限用于描述用户在系统中的操作能力。例如,可以定义访问资源的权限、执行某些操作的权限等。
  • 角色(Role):角色是权限的集合,它描述了用户在系统中的操作和访问能力。

在Spring Boot中使用Spring Security

在Spring Boot中,使用Spring Security非常容易,我们只需要添加以下依赖即可:

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

在完成依赖的添加之后,我们需要创建一个类继承WebSecurityConfigurerAdapter类,并添加@EnableWebSecurity注解,然后在configure方法中进行一些配置。例如:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

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

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

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

上面的代码中,configure方法中的配置意义如下:

  • authorizeRequests方法中,使用antMatchers函数来设置不同的权限分配。例如,/admin/**需要具有ADMIN角色的用户才能访问,/user/**可以被具有ADMINUSER角色的用户访问。
  • anyRequest().authenticated()表示其他请求需要用户经过认证才能访问。
  • formLogin()表示使用表单进行登录,loginPage("/login").permitAll()表示登录页面为/login,允许所有用户访问。
  • logout().permitAll()表示退出操作允许所有用户访问。

在完成配置之后,我们需要创建一个UserDetailsService的实现类来从数据库中读取用户信息,例如:

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserDao userDao;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userDao.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("Username not found");
        }
        List<GrantedAuthority> authorities = new ArrayList<>();
        for (Role role : user.getRoles()) {
            authorities.add(new SimpleGrantedAuthority(role.getName()));
        }
        return new org.springframework.security.core.userdetails.User(user.getUsername(),
                user.getPassword(), authorities);
    }

}

上面的代码中,我们从数据库中读取用户信息,并将用户的角色转换为Spring Security的GrantedAuthority

示例代码

下面提供两个示例代码来帮助大家理解如何使用Spring Security实现角色权限管理。

示例1:动态获取权限

在这个示例中,我们可以动态地获取用户的权限信息。我们可以通过在configure函数中添加如下代码,从数据库中读取当前用户的权限:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
        .anyRequest().authenticated()
        .and()
        .formLogin()
        .loginPage("/login").permitAll()
        .and()
        .logout().permitAll();
    http.authorizeRequests().anyRequest().access("@permissionService.hasPermission(request, authentication)");
}

@Bean
public DefaultWebSecurityExpressionHandler webSecurityExpressionHandler() {
    DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
    defaultWebSecurityExpressionHandler.setPermissionEvaluator(new CustomPermissionEvaluator());
    return defaultWebSecurityExpressionHandler;
}

@Bean
public DefaultMethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler() {
    DefaultMethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler = new DefaultMethodSecurityExpressionHandler();
    defaultMethodSecurityExpressionHandler.setPermissionEvaluator(new CustomPermissionEvaluator());
    return defaultMethodSecurityExpressionHandler;
}

然后再创建一个PermissionService类,实现如下代码:

@Service("permissionService")
public class PermissionService {

    private final Logger log = LoggerFactory.getLogger(PermissionService.class);

    /**
     * 判断是否有权限
     *
     * @param request
     * @param authentication
     * @return boolean
     */
    public boolean hasPermission(HttpServletRequest request, Authentication authentication) {

        String url = request.getRequestURI();
        String method = request.getMethod();

        Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
        if (authorities == null) {
            log.warn("no permission, url={}, method={}", url, method);
            return false;
        }

        for (GrantedAuthority authority : authorities) {
            String permission = authority.getAuthority();
            if (permission.equals("ALL") || permission.equals(url)) {
                return true;
            }
        }

        log.warn("no permission, url={}, method={}", url, method);

        return false;
    }

}

上面的代码中,hasPermission函数中将所有权限进行了管理,若用户没有对应权限,则无法访问。

示例2:在注解中使用角色权限

在这个示例中,我们可以在注解中使用角色权限进行限制。例如:

@PreAuthorize("hasRole('ADMIN')")
@RequestMapping("/user/delete")
public String deleteUser(@RequestParam("username") String username) {
    userService.deleteUser(username);
    return "redirect:/user/list";
}

在上面的代码中,我们使用了@PreAuthorize("hasRole('ADMIN')")注解来限制只有具有ADMIN角色的用户才可以执行deleteUser函数。

总结

通过上面的攻略,我们可以了解如何使用Spring Security来轻松实现角色权限的控制。同时,我们提供了两个示例,一个是动态获取权限,另一个是在注解中使用角色权限进行限制。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springsecurity轻松实现角色权限的示例代码 - Python技术站

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

相关文章

  • Java异常处理的机制是什么?

    Java异常处理机制是一种处理程序错误的方式。在Java程序运行时,如果程序出现错误(如除0、数组下标越界等),程序会抛出一个异常对象。此时,Java会尝试查找能够处理该异常的异常处理程序,若找到则执行该处理程序,若没有找到则程序终止并输出堆栈跟踪信息。 Java异常处理机制主要分为异常抛出、异常捕获和异常处理三个部分。 1.异常抛出 在Java中,异常是以…

    Java 2023年4月27日
    00
  • Java 负载均衡的 5 种算法实现原理

    Java 负载均衡的 5 种算法实现原理 什么是负载均衡(Load Balancing) 负载均衡是指将流量合理分配到多台服务器上,以避免单个服务器负荷过大无法正常工作,从而提高系统的可用性和性能。 负载均衡的算法类型 随机算法(RANDOM) 轮询算法(ROUND ROBIN) 哈希算法(HASH) 加权轮询算法(WEIGHTED ROUND ROBIN)…

    Java 2023年5月19日
    00
  • Spring Security全新版本使用方式

    下面是关于Spring Security全新版本使用方式的完整攻略: 什么是Spring Security? Spring Security是一个强大且可高度自定义的框架,用于身份验证和授权。它基于Servlet过滤器,可以轻松地将安全性添加到Web应用程序中。 如何使用Spring Security? 步骤一:添加Spring Security依赖 首先,…

    Java 2023年5月20日
    00
  • Java中线程死亡的几种情况实例分析

    Java中线程死亡的几种情况实例分析 当线程执行完任务或者发生异常时,线程将会结束并死亡。本文将详细讲解Java中线程死亡的几种情况实例分析。 线程执行完任务 当线程完成其分配的任务时,线程将自动结束并死亡。例如,下面是一个计算1到100的线程: public class MyThread extends Thread { @Override public …

    Java 2023年5月27日
    00
  • 剖析Java中的事件处理与异常处理机制

    剖析Java中的事件处理与异常处理机制 事件处理机制 Java中的事件处理机制是一种将某些动作(例如按钮点击、鼠标移动等)与一些代码相结合的机制。具体来说,Java使用了一种称为“观察者设计模式”的方法来实现事件处理。在这种模式中,一个对象(称为“主题”)维护了一组观察者,这些观察者都希望跟踪主题的状态。当主题状态发生变化时,它将会通知所有的观察者,使得它们…

    Java 2023年5月27日
    00
  • SpringBoot学习之全局异常处理设置(返回JSON)

    下面是关于“SpringBoot学习之全局异常处理设置(返回JSON)”的完整攻略。 一、背景 在实际开发中,经常因为代码中潜在的异常、业务异常等原因导致程序崩溃或返回异常信息。为了更好地保护程序的健壮性,我们通常会设置全局异常处理器,统一处理这些异常信息,并返回统一的异常信息给客户端。本文主要讲解如何在SpringBoot项目中配置全局异常处理器并返回JS…

    Java 2023年5月27日
    00
  • JAVA异常处理机制之throws/throw使用情况

    JAVA异常处理机制之throws/throw使用情况 在 Java 中,异常处理是一个非常重要的主题,Java 异常的设计是基于类层次结构的。在 Java 中,所有异常的根源是 Throwable 类。Throwable 类有两个子类:Error 和 Exception,其中 Error 一般为虚拟机错误,一般是程序员无法解决的错误。而 Exception…

    Java 2023年5月27日
    00
  • 如何查看Java字节码?

    当我们编写Java代码并使用编译器将其编译为字节码文件后,我们有时需要查看生成的字节码以便于了解程序实际执行的内容。下面是查看Java字节码的步骤: 第一步:编译java文件为字节码文件 在终端或命令行界面中进入Java源代码所在目录,使用javac命令将java源文件编译为字节码文件。例如: javac HelloWorld.java 完成后会在当前目录下…

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