当前位置: 首页 > 面试题库 >

Spring Security OAuth2中注入自定义userDetailsS​​ervice的问题

高迪
2023-03-14
问题内容

我正在使用Spring Security OAuth2
2.0.7.RELEASE。当我使用ORM连接到数据库并且默认JdbcUserDetailsManager使用jdbc时,我想实现自己的UserDetailsS​​ervice,即

@Service
public class UserService
    implements UserDetailsService {

    @Override
    public UserDetailsService loadUserByUsername(String username) throws UsernameNotFoundException {
        // I tested this logic and works fine so i avoid this lines
        return userDetailsService;
    }
}

此外,我修改了权限架构,如下所示:

mysql> describe authorities;
+--------------+---------------------+------+-----+---------+----------------+
| Field        | Type                | Null | Key | Default | Extra          |
+--------------+---------------------+------+-----+---------+----------------+
| authority_id | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| user_id      | bigint(20) unsigned | NO   | MUL | NULL    |                |
| authority    | varchar(256)        | NO   |     | NULL    |                |
+--------------+---------------------+------+-----+---------+----------------+

然后,我像这样注入我的自定义userDetailsS​​ervice:

@Configuration
@Import(OAuth2SupportConfig.class)
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends
        AuthorizationServerConfigurerAdapter {

  ...

  @Autowired
  private UserDetailsService userDetailsService

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer    endpoints)
            throws Exception {
        endpoints.authenticationManager(authenticationManager)
                .tokenStore(tokenStore).tokenServices(tokenService);
        endpoints.userDetailsService(userDetailsService); // Inject custom
        endpoints.authorizationCodeServices(authorizationCodeServices);
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients)
            throws Exception {
        clients.jdbc(dataSource);
    }
}

@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
public class AuthenticationManagerConfiguration
    extends GlobalAuthenticationConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Autowired
    private UserDetailsService userService;

    @Override
    public void init(AuthenticationManagerBuilder auth) throws Exception {
 auth.jdbcAuthentication().dataSource(this.dataSource).and().userDetailsService(this.userService);// Inject custom
    }
}

如果我使用Grant_type = password发送/ oauth / token请求,则会出现此错误

POST /oauth/token HTTP/1.1
Host: localhost:8080
Authorization: Basic aW5kaXJhOnNlY3JldA==
Cache-Control: no-cache
Postman-Token: c89baf37-8ad2-4270-5251-9715bfab470a
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=user&password=pass

(其中对clientId和clientSecret进行编码)

{
  "error": "unauthorized",
  "error_description": "PreparedStatementCallback; bad SQL grammar [select username,authority from authorities where username = ?]; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'username' in 'field list'"
}

显然仍在使用默认的JdbcDaoImpl。实际上,当我开始调试时,我发现遵循以下步骤:

  1. 对客户端进行身份验证(好的,因为我还没有修改oauth_client_details表)
  2. 使用我的自定义userDetailsS​​ervice对用户进行身份验证(好的,已修改users表,但我的自定义userDetailsS​​ervice支持更改)
  3. 使用默认userDetailsS​​ervice(ERROR)对用户进行身份验证

我不知道为什么会这样。对我来说,这听起来像个虫子。你有没有发现什么问题?


问题答案:

您正在使用auth.jdbcAuthentication().dataSource(this.dataSource).and().userDetailsService(‌​this.userService);// Inject custom,我在这里正在创建两个auth管理器-
一个具有默认值JdbcDaoImpldataSource指向auth管理器this.dataSource,另一个具有您的custom
userService。尝试仅放置auth.userDetailsService(this.userService)(我希望userService已经在内部自动连接了jdbc)。

这里的要点.and()是用于向身份验证管理器添加不同的身份验证配置,而不是配置jdbcAuthentication()一个。



 类似资料:
  • 问题内容: 我试图将其他数据保存在de用户主体对象中。 我所做的是: 在我现有的用户类中实现“ UserDetails”界面,我的其他数据(例如电子邮件地址等)保存在该类中。 然后,我创建了一个UserDetailsS​​ervice实现: 最后一步是在“安全性”配置中添加UserDetailsS​​ervice。 我在控制台中看到“ loadUserByName”被调用了两次(由于“ Found

  • 问题内容: 我正在研究Java Spring MVC应用程序。我已经实现了这样的接口: 我需要在method 内找到用户登录URL (因为该项目有多个登录URL)。实际上, 我想在实现内部访问请求参数。 问题答案: 只需将请求注入您的服务即可: 为了使其正常工作,您需要预先注册RequestContextListener,但是:

  • 我试图创建自定义包,我把我的其他程序,但当我导入这个包,它会给我错误。 这是自定义包文件: 这是我导入此包的测试文件: 我得到了这个错误: 我的目录设置是:

  • 问题内容: 我有以下Java代码- 我得到的错误是 如何正确访问注释字段? 问题答案: 默认情况下,注释在运行时不可用。您需要添加到注释定义以使其可用于运行时处理。例如: 在实践中,还应在实际尝试从字段中删除注释之前,检查该字段是否确实具有给定的注释。 另外,指定注释所属的元素类型也是一种好习惯。因此,您的示例将是:

  • 我在整个代码中有一堆常量,用于系统的各种可调整属性。我正在将它们全部移动到一个中央文件中。我目前的解决方案是有一个静态加载文件并公开各种getter方法,如下所示: 唯一的问题是,对于我从这个文件中获得的每个常量,我都有一些样板: 我不认为我想使用Spring或类似的东西,因为那看起来更像是boilerplae。我希望使用自定义注释来解决这个问题。我找到了这个教程,但是我真的不能弄清楚如何从注释处