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

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

盡管已授予權(quán)限,Spring Security 仍拒絕訪問(wèn)“@Secured”方法

盡管已授予權(quán)限,Spring Security 仍拒絕訪問(wèn)“@Secured”方法

森林海 2023-01-05 10:02:50
所以我有一個(gè)@Secure為 Spring Security 設(shè)計(jì)的 Vaadin (8) 視圖:@Secured(SUPERADMIN_ROLE)@SpringView(name = AdminHomeView.NAME)class AdminHomeView : DemoViewWithLabel(){    companion object {        const val NAME = "admin/home"    }    override val labelContent = "This is the protected admin section. You are authenticated and authorized."}哪里DemoViewWithLabel只是一個(gè)非常簡(jiǎn)單的抽象類顯示VerticalLayout(Label(labelContent))因此,如果我以具有該角色的身份登錄Superadmin,我就可以很好地訪問(wèn)該視圖。但是,讓我們做一個(gè)小改動(dòng)并覆蓋一個(gè)方法......@Secured(SUPERADMIN_ROLE)@SpringView(name = AdminHomeView.NAME)class AdminHomeView : DemoViewWithLabel(){    companion object {        const val NAME = "admin/home"    }    override val labelContent = "This is the protected admin section. You are authenticated and authorized."    override fun enter(event: ViewChangeListener.ViewChangeEvent?) {        super.enter(event)    }}這讓我AccessDeniedException……我不明白為什么。所以我打開(kāi)了 Spring Security 的 debug loggign,這就是它必須說(shuō)的:Secure object: ReflectiveMethodInvocation: public void ch.cypherk.myapp.ui.views.admin.AdminHomeView.enter(com.vaadin.navigator.ViewChangeListener$ViewChangeEvent);  target is of class [ch.cypherk.myapp.ui.views.admin.AdminHomeView];  Attributes: [Superadmin]Previously Authenticated: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@a6801701:  Principal: ch.cypherk.myapp.model.auth.MyUserDetails@6e4c5c5b;  Credentials: [PROTECTED];  Authenticated: true; Details: null;  Granted Authorities: RIGHT_MANAGER, Superadmin 到目前為止,這似乎還可以。它需要一個(gè)Superadmin權(quán)限,并且它有一個(gè)具有該Superadmin權(quán)限的經(jīng)過(guò)身份驗(yàn)證的用戶。
查看完整描述

1 回答

?
梵蒂岡之花

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

簡(jiǎn)而言之


授予的權(quán)限不會(huì)顯示ROLE_-prefix,因此會(huì)被RoleVoter.


將 替換為RoleVoter具有空前綴的自定義實(shí)現(xiàn)解決了該問(wèn)題。


全文


現(xiàn)在這留下了為什么我們可以訪問(wèn)視圖的問(wèn)題。解釋很簡(jiǎn)單,但需要更多的上下文。


我們正在努力將 Thorntail 應(yīng)用程序遷移到 Spring Boot。


我們正在使用 Vaadin 8(因?yàn)槲覀冇羞z留的 Vaadin 7 東西,我們還沒(méi)有設(shè)法擺脫它,需要支持)。


所以?


Vaadin 是一個(gè)單頁(yè)框架,Vaadin 8 有這種討厭的視圖引用方式,即它使用#!根 url(例如https://<host>:<port>/#!foo/bar/baz/...)。


之后什么#都沒(méi)有發(fā)送到服務(wù)器,這意味著我們無(wú)法區(qū)分訪問(wèn)/和訪問(wèn)/#!foo/bar/baz/...


因此,我們不能使用 Spring Security 來(lái)保護(hù)對(duì)視圖的訪問(wèn)。


并且我們有一個(gè) Vaadin 視圖,我們需要允許未經(jīng)身份驗(yàn)證的訪問(wèn)。


因此,我們被迫允許對(duì)/. (MainUI處理所有傳入請(qǐng)求的)將檢查用戶是否已通過(guò)身份驗(yàn)證,如果未通過(guò)身份驗(yàn)證,則重定向到登錄頁(yè)面。


對(duì)視圖本身的訪問(wèn)由 Vaadin 保護(hù),而不是 Spring。將SpringViewProvider找不到View用戶無(wú)權(quán)訪問(wèn)的內(nèi)容(因此,用戶無(wú)法導(dǎo)航到那里)。


但是,只要我們?cè)谠撘晥D上調(diào)用方法,Spring 安全性就會(huì)介入并執(zhí)行訪問(wèn)檢查。正是這些檢查失敗了,因?yàn)槭谟璧臋?quán)限沒(méi)有 Spring 預(yù)期的“ROLE_”前綴。(我原以為這只是一個(gè)約定,但事實(shí)并非如此;RoleVoter實(shí)際上忽略了不顯示前綴的權(quán)限,因此您必須那樣做,或者您必須提供自己的RoleVoter.)


解決方案相對(duì)簡(jiǎn)單......


@Configuration

@EnableGlobalMethodSecurity(

    securedEnabled = true,

    prePostEnabled = true,

    proxyTargetClass = true

)

class GlobalSecurityConfiguration : GlobalMethodSecurityConfiguration(){

    override fun accessDecisionManager(): AccessDecisionManager {

        return (super.accessDecisionManager() as AffirmativeBased).apply {

            decisionVoters.replaceAll {

                when(it){

                    is RoleVoter -> MyRoleVoter()

                    else -> it

                }

            }

        }

    }

}

在哪里


class MyRoleVoter : RoleVoter(){

    init {

        rolePrefix = ""

    }

}


查看完整回答
反對(duì) 回復(fù) 2023-01-05
  • 1 回答
  • 0 關(guān)注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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