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

spring boot security dao身份验证-已删除权限

杨腾
2023-03-14

开发一个spring boot应用程序,实现基于spring boot安全的基本身份验证数据库的安全。实现了UserDetailsService并覆盖了loadUserByUsername方法。通过此方法,我发现用户名、密码和角色信息已成功地从数据库用户表中检索到。

我的UserDetailsService loadUserByUsername

  @Override
public UserDetails loadUserByUsername(String userName)
        throws UsernameNotFoundException {
    UserInfo activeUserInfo = userInfoDAO.getActiveUser(userName);
    SimpleGrantedAuthority authority = new SimpleGrantedAuthority(activeUserInfo.getRole());
    User(activeUserInfo.getUserName(),
            activeUserInfo.getPassword(), Arrays.asList(authority));
    return userDetails;
}

返回DaoAUthenticationProvider retrieveUser包含从用户表查找返回的值,但AbstractUserDetailsAuthenticationProvider身份验证方法显示权限为零长度数组,用户名和密码正确返回。没有当局值将导致返回401错误凭据错误。

我在跟邮差测试。使用MySQL5.7.11使用以下定义的用户表:

  CREATE TABLE IF NOT EXISTS `users` (
  `username` varchar(50) NOT NULL,
  `password` varchar(100) NOT NULL,
  `full_name` varchar(100) NOT NULL,
  `role` varchar(50) NOT NULL,
  `country` varchar(100) NOT NULL,
  `enabled` tinyint(1) NOT NULL,
  PRIMARY KEY (`username`)
);

密码使用BCryptPasswordEncoder存储,并通过邮递员以纯文本形式发送密码。

My Application.Properties定义为:

    spring.datasource.url=jdbc:mysql://localhost:3306/actotracker?useSSL=false
spring.datasource.username=root
spring.datasource.password=Dial0gicRots
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.max-idle=20
spring.datasource.tomcat.min-idle=15
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
spring.jpa.properties.hibernate.id.new_generator_mappings = false
spring.jpa.properties.hibernate.format_sql = true
security.basic.enabled=true
security.basic.realm=Spring
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

Java version 1.8 Spring boot 1.5.3.release

注册密码编码器的代码:

  private final Logger log = LoggerFactory.getLogger(MyApplication.class);
@Autowired
private AppUserDetailService appUserDetailsService;
@Autowired
private AppAuthenticationEntryPoint appAuthenticationEntryPoint;
@Override
protected void configure(HttpSecurity http) throws Exception {
    log.info("In configure");
    http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/user/**").hasAnyRole("ROLE_ADMIN","ROLE_USER")
            .and().httpBasic().realmName("Spring")
         //   .and().httpBasic()
            .authenticationEntryPoint(appAuthenticationEntryPoint);
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    log.info("configGlobal");
    BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    auth.userDetailsService(appUserDetailsService).passwordEncoder(passwordEncoder);
}

邮差值:http://localhost:8080/user/distances username field:tim password:纯文本密码值身份验证设置为基本身份验证

共有1个答案

严恩
2023-03-14

dur是正确的,401是由密码不匹配引起的。我编写了一个小例程来获取纯文本字符串并bcrypt它。`

        String creds = "xxxxxxx";       
        BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
        String encPassword = bCryptPasswordEncoder.encode(creds);

我在用户身份验证表中使用/存储了encPassword值。

进入BCryptPasswordEncoder类BCrypt.CheckPw,我发现原始文本字符串被转换为不同的加密值。使用新的加密值更新了我的数据库用户表条目,我的授权成功。

 类似资料:
  • OAuth术语已经困扰我很久了。OAuth授权是像一些人建议的那样,还是认证? 如果我错了,请纠正我,但我一直认为授权是允许某人访问某个资源的行为,而OAuth似乎没有任何实际允许用户访问给定资源的实现。OAuth实现所讨论的都是为用户提供一个令牌(签名的,有时是加密的)。然后,每次调用都会将该令牌传递到后端服务endpoint,在后端服务endpoint上检查该令牌的有效性,这也不是OAuth的

  • 我正在使用SpringBoot设计一个REST API。同时,我正在构建一个使用该API的SPA。 为了安全起见,我选择了易于设置的Basic Auth。我现在面临的是401挑战问题。当我的SPA向API发出请求时,如果验证失败,浏览器会显示我想要删除的经典登录弹出窗口。 我到处读到,当401响应还包含一个值为“Basic”的WWW authenticate标头时,浏览器会显示这个弹出窗口。 所以

  • 我有一个已经完成的j2ee(jsf、cdi、jpa)应用程序,它完美地使用了ApacheShiro,它工作得非常好,我喜欢Shiro注释(hasRole、hasPermission等)。 现在,该项目还必须能够通过SiteMinder进行身份验证,我的问题是: 我如何设置一个领域来处理SiteMinder身份验证而不丢失Shiro授权(似乎SiteMinder会在HTTP头中给我用户名和Rolen

  • 身份验证 PDF版下载 企业应用中的URL链接可以通过OAuth2.0验证接口来获取员工的身份信息。 通过此接口获取员工身份会有一定的时间开销。对于频繁获取员工身份的场景,建议采用如下方案: 企业应用中的URL链接直接填写企业自己的页面地址; 员工跳转到企业页面时,企业校验是否有代表员工身份的cookie,此cookie由企业生成; 如果没有获取到cookie,重定向到OAuth验证链接,获取员工

  • 问题内容: 使用developers.google.com,我们创建了api用户,并将凭据下载为json文件。现在,在我的Macbook上,gspread身份验证在使用凭据.json时工作正常。当将相同的配置移到aws上的linux服务器上时,给出了403权限不足错误。 Pip和python版本相同。 例外 基本代码 问题答案: 尝试将变量更改为以下内容: 确保在API控制台中启用了Drive A

  • 我能够在没有用户的情况下使用Get access从Microsoft Graph访问资源。但是,这个方法不允许我访问需要委派权限的资源。 我还尝试使用代表用户获取访问权限方法,但它需要我的用户通过网页登录,这在我的方案中是不需要的。 是否可以生成一个使用寿命长(可能超过一年)的授权代码,并使用该代码请求访问令牌,然后使用该令牌获取需要授权权限的资源? 注意:我知道生成具有这么长生命周期的授权代码不