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 = ""
}
}
添加回答
舉報(bào)