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

Spring boot HTTP基本传递到JDBC

崔涵亮
2023-03-14
auth.inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
@Bean
@Primary
public DataSource dataSource() {
    return DataSourceBuilder
        .create()
        .username("")
        .password("")
        .url("")
        .driverClassName("")
        .build();
}

共有1个答案

澹台胜
2023-03-14

使用UserCredentialsDatasourceAdapter作为@“M.Deinum”建议的某种筛选器或处理AuthenticationSuccessEvent

基本上,您应该只使用当前主体usernamepassword调用SetCredentialsForCurrentThread方法。

您必须禁用身份验证管理器的凭据擦除,以便能够在身份验证后检索用户密码。

@EnableWebSecurity
public static class Security extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.eraseCredentials(false) // for password retrieving
            .inMemoryAuthentication()
            .withUser("postgres").password("postgres1").roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.httpBasic().and().authorizeRequests().mvcMatchers("/").fullyAuthenticated();
    }
}

数据源适配器:

@Bean
public UserCredentialsDataSourceAdapter dataSource(DataSourceProperties properties) {
    final UserCredentialsDataSourceAdapter dataSourceAdapter = new UserCredentialsDataSourceAdapter();
    dataSourceAdapter.setTargetDataSource(DataSourceBuilder.create()
            .driverClassName(properties.getDriverClassName())
            .url(properties.getUrl())
            .username(properties.getUsername())
            .password(properties.getPassword())
            .type(SimpleDriverDataSource.class) // disable pooling
            .build());

    ((SimpleDriverDataSource) dataSourceAdapter.getTargetDataSource()).setDriverClass(org.postgresql.Driver.class); //binder won't set it automatically
    return dataSourceAdapter;
}

AuthenticationSuccessHandler:

@Component
public static class AuthenticationHandler /*implements ApplicationListener<AuthenticationSuccessEvent> use that if your spring version is less than 4.2*/ {
    private final UserCredentialsDataSourceAdapter dataSourceAdapter;

    @Autowired
    public AuthenticationHandler(UserCredentialsDataSourceAdapter dataSourceAdapter) {
        this.dataSourceAdapter = dataSourceAdapter;
    }

    @EventListener(classes = AuthenticationSuccessEvent.class)
    public void authenticationSuccess(AuthenticationSuccessEvent event) {
        final Authentication authentication = event.getAuthentication();
        final User user = (User) authentication.getPrincipal();
        dataSourceAdapter.setCredentialsForCurrentThread(user.getUsername(), user.getPassword()); // <- the most important part
    }
}

也可以使用筛选器代替事件侦听器:

@Component
public static class DataSourceCredentialsFilter extends GenericFilterBean {
    private final UserCredentialsDataSourceAdapter dataSourceAdapter;

    @Autowired
    public DataSourceCredentialsFilter(UserCredentialsDataSourceAdapter dataSourceAdapter) {
        this.dataSourceAdapter = dataSourceAdapter;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        final User user = (User) authentication.getPrincipal();
        dataSourceAdapter.setCredentialsForCurrentThread(user.getUsername(), user.getPassword());
        chain.doFilter(request, response);
        dataSourceAdapter.removeCredentialsFromCurrentThread();
    }
}
 类似资料:
  • 打印板到控制台: 我希望用户对RaisedButton的选择显示一个“X”,而计算机的选择显示一个“O”。

  • 我是Java的新手,正在尝试制作一个基本的体质量计算器。我的问题是我需要问问题,转换度量值,然后将它传递给另一个方法,然后在一个单独的方法中显示结果。我在下面添加了代码,但每次都返回一个1.0作为答案。 更新的代码,现在正在获取;输入体重(磅):180输入身高(英寸):68计算出的体重指数为:1.1415618118905313 E-5建立成功(总时间:3秒)

  • 问题内容: 我正在尝试将数据发送到我的PHP脚本来处理一些东西并生成一些东西。 在我的PHP文件中,我尝试检索专辑名称。虽然当我验证它时,我创建了一个警报以显示什么都没收到,但是我尝试通过 虽然会说undefined:/ 问题答案: 您正在发送POST AJAX请求,因此请在您的服务器上使用来获取值。我也建议您这样编写请求,以确保正确的编码: 或简称为: 如果您想使用GET请求: 或简称为: 现在

  • 问题内容: 我在上面直接写了上面的内容,因此可能无法编译,但认为可以。 任何人都可以从存储的角度来简短地解释它的工作原理吗?它通过计算5 (5-1)开始,然后依次下降到4 (4-1)然后是3 *(3-1).....直到达到1,它将只返回1,对吗?抱歉,我太粗略了,我只想知道这是如何工作的 谢谢 但随着工作的进行,它将获得各个阶段的值 5 (5-1)4 (4-1)… … … 这些如何存储然后取回,或

  • 以下是我正在尝试使用的代码: (Python 3.6) 基本上,函数有一些链式的调用,所以这个方法必须是,因为需要链式调用。然而,此方法是在延迟后触发的,当运行此代码时,会出现以下问题: /usr/lib64/python3。6/异步IO/事件。py:127:RuntimeWarning:coroutine'foo'从未被期待过_回调(*self.\u args) 在以后的中处理此调用的正确方法是