深入理解GrantedAuthority

发布时间:2023-05-20

一、简介

在Spring Security中,GrantedAuthority是一个很重要且必不可少的概念。它代表了一个特定权限,能够授予给UserDetails对象中的用户。在用户验证通过后,Spring Security使用GrantedAuthority对象来决定用户是否具有执行某个动作的权限。 GrantedAuthority是一个接口,通常使用SimpleGrantedAuthority类来实现,它可以接受一个权限参数,在实现时,我们可以通过这个参数来创建具有不同权限的SimpleGrantedAuthority对象。

public interface GrantedAuthority {
   String getAuthority();
}

二、使用方式

在Spring Security中,我们可以通过以下方式来使用GrantedAuthority对象: 1、通过UserDetails对象创建Authorization对象:

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    // ...
    List<GrantedAuthority> authorities = new ArrayList<>();
    authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
    return new User(username, password, authorities);
}

2、使用方法注解来控制权限:

@PreAuthorize("hasAuthority('ROLE_USER')")
public void doSomething() {
    // ...
}

3、使用access表达式来控制权限:

http.authorizeRequests()
    .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
    .antMatchers("/user/**").access("hasRole('ROLE_USER')")
    .anyRequest().authenticated();

三、与数据库结合

在实际应用中,我们通常会将用户的权限信息存储在数据库中。因此,我们需要对Spring Security提供的默认的内存方式进行扩展,以支持从数据库中加载用户权限信息。这一过程涉及到两个重要的类: 1、UserDetailsService:从外部数据源加载用户信息

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    @Autowired
    private UserRepository userRepository;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Optional<User> user = userRepository.findByUsername(username);
        if (!user.isPresent()) {
            throw new UsernameNotFoundException("User not found!");
        }
        return new User(user.get().getUsername(), user.get().getPassword(), getAuthorities(user.get().getRoles()));
    }
    private List<GrantedAuthority> getAuthorities(Set<Role> roles) {
        List<GrantedAuthority> authorities = new ArrayList<>();
        for (Role role : roles) {
            authorities.add(new SimpleGrantedAuthority(role.getName()));
        }
        return authorities;
    }
}

2、UserDetailsManager:管理用户信息 在需要创建用户时,我们可以使用UserDetailsManager创建UserDetails对象:

@Autowired
private UserDetailsManager userDetailsManager;
public void createUser(String username, String password, Set<String> authorities) {
    List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
    for (String authority : authorities) {
        grantedAuthorities.add(new SimpleGrantedAuthority(authority));
    }
    // 使用UserDetailsManager创建UserDetails对象
    UserDetails userDetails = User.builder()
            .username(username)
            .password(passwordEncoder.encode(password))
            .authorities(grantedAuthorities)
            .build();
    userDetailsManager.createUser(userDetails);
}

四、总结

GrantedAuthority是Spring Security中一个非常核心的概念,它提供了权限控制和管理的基础。在实际应用中,我们通常会将用户权限信息存储在外部数据源中,并通过UserDetailsService从中加载信息,并通过UserDetailsManager管理用户信息。通过掌握这些知识,我们可以更好地理解Spring Security的权限管理机制,为我们的应用程序提供更为安全的保障。