SpringSecurity-SpirngBoot-方法级授权(SpringSecurity6.3新特性)(四)

SpringSecurity-SpirngBoot-方法级授权(SpringSecurity6.3新特性)(四)

本章使用SpringSecurity6.3新特性实现数据级别的鉴权,主要的目的是实现不同权限的用户查询同一个方法,限制一些内容只能拥有特定权限的用户才能看到,其他没有该权限的用户显示为空。

在上一节的基础上,新建spring-security-authorization-data分支。

  1. 修改SecurityConfiguration类,添加rob用户,权限为"message:read", “user:read”;新建luke用户,权限为"message:read"

    @Bean
    CustomUserRepository customUserRepository() {
         
         
        String password = new BCryptPasswordEncoder().encode("password");
    
        CustomUser customUser1 = new CustomUser(1L, "rob", password, "message:read", "user:read");
        CustomUser customUser2 = new CustomUser(2L, "luke", password, "message:read");
        Map<String, CustomUser> emailToCustomUser = new HashMap<>();
        emailToCustomUser.put(customUser1.getEmail(), customUser1);
        emailToCustomUser.put(customUser2.getEmail(), customUser2);
        return new MapCustomUserRepository(emailToCustomUser);
    }
    

    修改CustomUser、CustomUserRepositoryUserDetailsService类,以适配修改后的SecurityConfiguration:

    public class CustomUser {
         
         
        private final long id;
    
        private final String email;
    
        @JsonIgnore
        private final String password;
    	
        // 用户权限
        private final String[] authoritie;
    
        @JsonCreator
        public CustomUser(long id, String email, String password, String ...authoritie) {
         
         
            this.id = id;
            this.email = email;
            this.password = password;
            this.authoritie = authoritie;
        }
        public long getId() {
         
         
            return this.id;
        }
    
        public String getEmail() {
         
         
            return this.email;
        }
    
        public String getPassword() {
         
         
            return this.password;
        }
    
        public String[] getAuthoritie() {
         
         
            return authoritie;
        }
    
        @Override
        public String toString() {
         
         
            return email;
        }
    
        @Override
        public int hashCode() {
         
         
            return email.hashCode();
        }
    
        @Override
        public boolean equals(Object obj) {
         
         
            return this.toString().equals(obj.toString());
        }
    }
    
    @Service
    public class CustomUserRepositoryUserDetailsService implements UserDetailsService {
         
         
        private final CustomUserRepository userRepository;
    
    
        public CustomUserRepositoryUserDetailsService(CustomUserRepository userRepository) {
         
         
            this.userRepository = userRepository;
        }
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
         
         
            // 查询用户名对应的用户
            CustomUser customUser = this.userRepository.findCustomUserByEmail(username);
            if (customUser == null) {
         
         
                // 用户不存在 抛出异常
                throw new UsernameNotFoundException("username " + username + " is not found");
            }
            return new CustomUserDetails(customUser);
        }
    
        static final class CustomUserDetails extends CustomUser implements UserDetails {
         
         
    
            private final List<GrantedAuthority> ROLE_USER;
    
            CustomUserD
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值