当前位置: 首页 > 知识库问答 >
问题:

在没有用户角色的情况下实现Spring Security性

谭桐
2023-03-14

我想在没有用户角色的情况下实现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);
}

        }

我有两个问题:

>

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

    如何使用用户名和密码验证请求。我看到,public UserDetails loadUserByUsername(字符串用户名)只能接受用户名。是否有其他方法来实现代码?

  • 共有1个答案

    王修为
    2023-03-14

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

     类似资料:
    • 我正在尝试构建一个基本的REST服务,它使用Spring Security和OAuth2.0身份验证和授权进行安全保护。 我试图限制所涉及的元素,所以我不是复制粘贴依赖于Spring bean、Spring MVC等的Spring Security Oath XML配置,而是直接使用Spring Security Oauth类。 尝试从/oauth/Token获取访问令牌时遇到了一个障碍。我可能缺

    • 现在亚马逊加入了单点登录供应商的行列。它们只支持OAuth2.0。 总而言之,OAuth2.0似乎是获胜的候选者,而不是openid,因为我关心的所有提供者现在都支持oauth。 所以我考虑直接在我的电子商务站点中实现oauth。 Facebook提供了一种完全的服务器端方式,不涉及JavaScripts。 亚马逊没有。 但它都是OAuth2.0,不是吗? 我想实现几个oauth提供程序。其中肯定

    • 我看到的所有解决方案都需要使用。但是,我想在Eclipse之外的单个文件上使用CDT解析器。那有什么办法吗?

    • 问题内容: 我从 JavaEE 6中 了解到,它是可选的。 因此,如果没有 web.xml ,如何告诉应用程序服务器使用Jersey作为JAX-RS规范的实现? 问题答案: 就如何在没有web.xml的情况下实现应用程序配置而言,@AlexNevidomsky的回答是正确的。您在子类上使用注释。 有关部署选项的更多信息,请参见JAX-RS规范-> 2.3发布-> 2.3.2Servlet。 或更常

    • 我试图在不使用Box2D的情况下为libgdx角色(玩家和敌人)实现碰撞检测。正如我所读到的那样,Box2D支持内置碰撞检测,但由于我的游戏不涉及环境中的任何物理因素,因此我不习惯仅为此使用Box2D。 我发现的许多示例通过为此定义一个边界框(矩形)来启用冲突检测,但我正在寻找一个内置的解决方案。

    • 我想在Android Studio中有一个BackgroundService,它每隔几分钟运行一次,检查JSON文件是否被更改。我的问题是如何让服务运行整个时间e。例如,在待机状态下,在启动后&在应用程序启动后。我的意思是,WhatsApp或其他消息应用是如何始终运行任务的?