第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Spring security:使用數(shù)據(jù)庫中的角色登錄

Spring security:使用數(shù)據(jù)庫中的角色登錄

Helenr 2023-09-27 10:15:22
我在 db: 中有 3 個(gè)表USER(login,password),ROLE(role_name)并且USER_ROLE_LINK (user_id, role_id)我想為具有特定角色的用戶授予對(duì)特定頁面的訪問權(quán)限。我在這個(gè)類中配置了安全性:@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter{    @Autowired    private DataSource dataSource;    @Override    protected void configure(HttpSecurity http) throws Exception     {        http            .csrf()            .disable()            .authorizeRequests()            .antMatchers("/", "/home").permitAll()            .anyRequest()            .authenticated()            .and()            .formLogin()            .loginPage("/login")            .permitAll()            .and()            .logout()            .permitAll();    }    @Override    protected void configure(AuthenticationManagerBuilder auth) throws Exception    {        auth.jdbcAuthentication()            .dataSource(dataSource)            .passwordEncoder(NoOpPasswordEncoder.getInstance())            .usersByUsernameQuery("select login, password, active from USER where login=?")            .authoritiesByUsernameQuery("select ur.user_id, ur.role_id from USER u inner join USER_ROLE_LINK ur on u.id = ur.user_id where u.login=?");    }}它工作正常,只有那些至少擁有一個(gè)角色的用戶才能訪問該應(yīng)用程序?,F(xiàn)在我想為具有特定角色的用戶授予特定頁面的訪問權(quán)限,該怎么做?我已經(jīng)嘗試過這個(gè):antMatchers("/mypage").hasRole("MODERATOR")但它會(huì)拋出403 error. 我應(yīng)該如何告訴從表的列Spring中查找用戶的角色?ROLErole_name
查看完整描述

1 回答

?
回首憶惘然

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊

效果好嗎?

不,方法參數(shù)中的查詢字符串錯(cuò)誤.authoritiesByUsernameQuery。

查詢返回類型即結(jié)果集應(yīng)該是用戶名和角色

SELECT username, role

如果連接查詢結(jié)果結(jié)果集列名稱如下所示:

https://img1.sycdn.imooc.com//651390780001680e02050037.jpg

您應(yīng)該修改為如下所示:

https://img1.sycdn.imooc.com//651390840001dcdd01830038.jpg

通過使用別名SELECT ud.username AS username, rm.name AS role

我試過這個(gè): antMatchers("/mypage").hasRole("MODERATOR") 但它拋出 403 錯(cuò)誤

它不會(huì)工作,因?yàn)槟氖跈?quán)部分不正確。

我應(yīng)該如何告訴Spring從ROLE表的role_name列中查找用戶的角色?

需要完整的認(rèn)證和授權(quán)配置。請(qǐng)參閱下面的相同內(nèi)容。

我將舉一個(gè)可行的例子:

考慮您的要求具有類似的三個(gè)表userdetailsrolemaster、 和 ,user_role_mapping如下所示。

https://img1.sycdn.imooc.com//6513909000011aff06530372.jpg

那么你的配置將是


@Configuration

@EnableWebSecurity

public class SpringSecurityConfig extends WebSecurityConfigurerAdapter 

{


    @Autowired

    DataSource dataSource;


    @Autowired

    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception

    {

    //If you want to store plain password you can use NoOpPasswordEncoder

    auth.jdbcAuthentication().dataSource(dataSource).passwordEncoder(passwordEncoder())

                .usersByUsernameQuery("select username, password, enabled from userdetails where userName=?")

                .authoritiesByUsernameQuery(

                        "SELECT ud.username AS username, rm.name AS role FROM user_role_mapping map " + 

                        "INNER JOIN userdetails ud ON map.userId = ud.id " + 

                        "INNER JOIN rolemaster rm ON  map.roleId = rm.id  where userName = ?");

    }


    @Override

    protected void configure(final HttpSecurity http) throws Exception

    {

        http

        .authorizeRequests()

            .antMatchers("/resources/**", "/", "/login", "/api/**").permitAll()

            .antMatchers("/config/**", "/app/admin/**")

                .hasRole("ADMIN")

            .antMatchers("/app/user/**")

            .hasAnyRole("ADMIN", "USER")

        .and().exceptionHandling().accessDeniedPage("/403")

        .and().formLogin()

            .loginPage("/login")

            .usernameParameter("userName").passwordParameter("password") 

            .defaultSuccessUrl("/app/user/dashboard")

            .failureUrl("/login?error=true")

        .and().logout()

            .logoutSuccessHandler(new CustomLogoutSuccessHandler())

            .invalidateHttpSession(true)

        .and()

            .csrf()

                .disable();


        http.sessionManagement().maximumSessions(1).expiredUrl("/login?expired=true");

    }


    @Bean

    public PasswordEncoder passwordEncoder() 

    {

        return new BCryptPasswordEncoder();

    }


}

授權(quán)部分

繞過對(duì)存儲(chǔ)在 resources 文件夾中的 javascript 和 css 等資源的授權(quán)。


.antMatchers("/resources/**", "/", "/login", "/api/**").permitAll()

對(duì)于管理員網(wǎng)址


.antMatchers("/config/**", "/app/admin/**").hasRole("ADMIN")

對(duì)于可以被多個(gè)角色訪問的url


.antMatchers("/app/user/**").hasAnyRole("ADMIN", "USER")

以及.formLogin()配置:


.usernameParameter("userName").passwordParameter("password") 

// Use above line of code if your login form param names are different 

// than defaults -> "username" "password"

.defaultSuccessUrl("/app/user/dashboard")

// If defaultSuccessUrl not configured then after login success redirects to "/"

異常處理部分


.exceptionHandling().accessDeniedPage("/403")

//If you want custom denied screen to be displayed.


查看完整回答
反對(duì) 回復(fù) 2023-09-27
  • 1 回答
  • 0 關(guān)注
  • 112 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)