【问题标题】:Implement Spring Security without user Role实现没有用户角色的 Spring Security
【发布时间】:2019-02-13 11:12:24
【问题描述】:

我想在没有用户角色的情况下实现 Spring Security。我试过这个:

我想配置 Spring Security 以使用数据库来处理 Rest api 请求。我试过这个:

    @Configuration
    @EnableWebSecurity
    @Import(value= {Application.class, ContextDatasource.class})
    @ComponentScan(basePackages= {"org.rest.api.server.*"})
    public class ApplicationSecurityConfig extends WebSecurityConfigurerAdapter {

        @Autowired 
        private RestAuthEntryPoint authenticationEntryPoint;

        @Autowired
        MyUserDetailsService myUserDetailsService;

        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    //      auth
    //      .inMemoryAuthentication()
    //      .withUser("test")
    //      .password(passwordEncoder().encode("testpwd"))
    //      .authorities("ROLE_USER");
            auth.userDetailsService(myUserDetailsService);
            auth.authenticationProvider(authenticationProvider());
        }
        @Bean
        public DaoAuthenticationProvider authenticationProvider() {
            DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
            authenticationProvider.setUserDetailsService(myUserDetailsService);
            authenticationProvider.setPasswordEncoder(passwordEncoder());
            return authenticationProvider;
        }
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
            .authorizeRequests()
            .antMatchers("/securityNone")
            .permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .httpBasic()
            .authenticationEntryPoint(authenticationEntryPoint);
        }
        @Bean
        public PasswordEncoder passwordEncoder() {
            return NoOpPasswordEncoder.getInstance();
        }
    }

服务:

    public interface MerchantsService {

        public Merchants getCredentials(String login, String pwd) throws Exception;
    }

服务实现

@Service
@Qualifier("merchantsService")
@Transactional
public class MerchantsServiceImpl implements MerchantsService {

    @Autowired
    private EntityManager entityManager;

    @Override
    public Merchants getCredentials(String login, String pwd) throws Exception {
        String hql = "select e from " + Merchants.class.getName() + " e where e.login = ? and e.pwd = ?";

        Query query = entityManager.createQuery(hql).setParameter(0, login).setParameter(1, pwd);
        Merchants merchants = (Merchants) query.getSingleResult();

        return merchants;
    }
}

实施:

    @Service
        public class MyUserDetailsService implements UserDetailsService {

            @Autowired
            private MerchantsService merchantsService;

            @Override
            public UserDetails loadUserByUsername(String username) {
 Merchants user = merchantsService.getCredentials(username, pwd);

        Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
        for (Role role : user.getRoles()){
            grantedAuthorities.add(new SimpleGrantedAuthority(role.getName()));
        }

        return new User(user.getUsername(), user.getPassword(), grantedAuthorities);
}

        }

我有 2 个问题:

  1. 如何将 Spring Security 与用户角色一起使用?

  2. 如何使用用户名和密码验证请求。我看到public UserDetails loadUserByUsername(String username) 只能接受用户名。还有其他方法可以实现代码吗?

【问题讨论】:

    标签: java spring spring-security spring-security-oauth2 spring-security-rest


    【解决方案1】:

    因为 Spring Security 是关于身份验证和授权的。您想自己进行身份验证,也不需要角色。那你为什么要使用 Spring Security。 Spring Security 为您提供了进行身份验证和授权的最佳方式,因此应该使用它。因为您已经实现了UserDetailsService。 Spring Security 本身使用配置的PasswordEncoder bean 进行密码验证。

    【讨论】:

      猜你喜欢
      • 2018-07-28
      • 2015-11-01
      • 2014-05-01
      • 1970-01-01
      • 2011-10-08
      • 2011-07-21
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      相关资源
      最近更新 更多