sql >> データベース >  >> RDS >> Mysql

WebSecurityConfigurerAdapterのhttpBasicおよびjdbcAuthenticationによるユーザー検証の問題

    一重引用符でクエリusername='?' 問題を引き起こしています。

    変更

     @Autowired
     public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 
     {
         auth.jdbcAuthentication().dataSource(dataSource)
                 .usersByUsernameQuery("select username, password, true"
                     + " from apiclient where username='?'")
             .authoritiesByUsernameQuery("select username, role"
                     + " from apiclient where username='?'");
    }
    

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication()
                .dataSource(dataSource)
                .usersByUsernameQuery("select username, password, true"
                        + " from apiclient where username=?")
                .authoritiesByUsernameQuery("select username, role"
                        + " from apiclient where username=?");
    }
    

    githubリンクから共有されているコードを確認した後、
    プロジェクトで、レベルDEBUGのログを有効にしていません。

    DEBUGログを有効にした後、気づきました

    DEBUG - Executing prepared SQL statement [select username, password, true from apiclient where username='?'] 
    DEBUG - Fetching JDBC Connection from DataSource 
    ...
    DEBUG - Caching SQL error codes for DataSource [[email protected]]: database product name is 'H2' 
    DEBUG - Unable to translate SQLException with Error code '90008', will now try the fallback translator
    
    ...
    
    DEBUG - Access is denied (user is anonymous); redirecting to authentication entry point 
    org.springframework.security.access.AccessDeniedException: Access is denied
        at org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:84)
    

    クエリはusersByUsernameの取得に失敗し(クエリ内の単一引用符が原因)、authoritiesByUsernameクエリは例外のために起動されなかったため、春のセキュリティでユーザーをROLE_ANONYMOUSとして扱い、401(無許可)

    STS/Eclipseコンソールでログを表示したい場合。
    1。 src / main / resources
    2の下にlogback.xmlファイルを作成します。以下のコードをコピー

    <?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
        <appender name="ALL_ROLLING_FILE"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>..\logs\SMTH_Project.%d{yyyy-MM-dd_HH}.%i.log.zip</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>100MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <MaxHistory>30</MaxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>%d{yyyy MM dd HH:mm:ss:SSS} [%-40thread] %-5level{5} - %msg %n</pattern>
            </encoder>
        </appender>
    
        <appender name="ASYNC"
            class="ch.qos.logback.classic.AsyncAppender">
            <appender-ref ref="ALL_ROLLING_FILE" />
            <queueSize>1000000</queueSize>
            <discardingThreshold>0</discardingThreshold>
        </appender>
    
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%-5level{5} - %msg %n</pattern>
            </encoder>
        </appender>
    
        <root level="DEBUG">
            <appender-ref ref="STDOUT" />
        </root>
    </configuration>
    



    1. mysqlデータベースからJSON配列を構築する方法

    2. PHPで外部キーを使用する方法

    3. データベース設計でのさまざまなMySQLストレージエンジンの使用

    4. T-SQL火曜日#67:新しいバックアップと復元の拡張イベント