史上最簡單的Spring Security總結(jié)——授權(quán)篇

Spring Security是一款強(qiáng)大的安全認(rèn)證服務(wù)框架佩谣,它的原理就是在訪問我們的系統(tǒng)前加了一系列的過濾器干茉,可以稱為過濾器鏈捡偏。它的兩大核心就是認(rèn)證和授權(quán),本文主要描述的授權(quán)篇陷揪,認(rèn)證篇請看http://www.reibang.com/p/24c6a65c3913。那廢話不多說夷都,我們接著認(rèn)證篇繼續(xù)開車吧(新手司機(jī)产镐,請坐穩(wěn)!持續(xù)更新)

權(quán)限表達(dá)式

springsecurity是通過權(quán)限表達(dá)式控制授權(quán)九串,springsecurity的權(quán)限表達(dá)式及說明如下:

表達(dá)式 說明
permitAll 永遠(yuǎn)返回true
denyAll 永遠(yuǎn)返回false
anonymous 當(dāng)前用戶是anonymous時返回true
rememberMe 當(dāng)前用戶是rememberMe用戶時返回true
authenticated 當(dāng)前用戶不是anonymous時返回true
fullAuthenticated 當(dāng)前用戶既不是anonymous也不是rememberMe用戶時返回true
hasRole(role) 用戶擁有指定的角色權(quán)限時返回true
hasAnyRole([role1绞佩,role2]) 用戶擁有任意一個指定的角色權(quán)限時返回true
hasAuthority(authority) 用戶擁有指定的權(quán)限時返回true
hasAnyAuthority([authority1,authority2]) 用戶擁有任意一個指定的權(quán)限時返回true
hasIpAddress('192.168.1.0') 請求發(fā)送的Ip匹配時返回true

接著認(rèn)證部分的代碼,在MySecurityConfig 的configure方法里添加需要的權(quán)限表達(dá)式:

@Configuration
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
//        http.httpBasic()
        http.authorizeRequests()
                .antMatchers("/hello.html")
                .permitAll()//注意這里hello.html需要配置成不需要身份認(rèn)證猪钮,否則會報(bào)重定向次數(shù)過多
                .antMatchers("/user.html")
//              .hasRole("ADMIN")//用hasRole時品山,在我們返回的UserDetails的Authority需要加Role_ADMIN
//              .hasAuthority("read")//用戶自定義的權(quán)限,返回的UserDetails的Authority只要與這里匹配就可以烤低,這里不需要加ROLE_
//              .access("hasRole('ADMIN') and hasIpAddress('192.168.0.1')")//指定有ADMIN權(quán)限并且匹配相應(yīng)的IP
                .access("@MyRbacService.findAuthority(request,authentication)")//指定我們自己寫的方法控制權(quán)限
                .and()
                .formLogin()
                .loginPage("/hello.html")//指定我們自己的登錄頁面
                .loginProcessingUrl("/admin/login")//指定讓UsernamePasswordAuthenticationFilter攔截器攔截的路徑
                .defaultSuccessUrl("/index")//默認(rèn)登錄成功后跳轉(zhuǎn)的頁面
                .and()
                .authorizeRequests()
                .anyRequest()
                .authenticated();
        http.csrf().disable();
        http.headers().frameOptions().sameOrigin();
    }
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

在強(qiáng)調(diào)一次肘交,用hasRole時,在我們MyUserDetailService 返回的權(quán)限集合一定要加ROLE_ADMIN

@Component
public class MyUserDetailService implements UserDetailsService {
    @Autowired
    private PasswordEncoder passwordEncoder;
    @Override
    public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {
        return new User(name,passwordEncoder.encode("123456"), AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_ADMIN"));
    }
}

在上面配置類里用到了access扑馁,可以拼接我們自己定義的權(quán)限表達(dá)式涯呻,也可以指定我們自己寫的控制權(quán)限類如.access("@MyRbacService.findAuthority(request,authentication)")
自定義權(quán)限控制類之前需要在pom里添加兩個依賴

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
</dependency>

對應(yīng)的Service,參數(shù)需要HttpServletRequest 和Authentication 腻要,返回值一定要是boolean:

public interface MyRbacService {
    boolean findAuthority(HttpServletRequest request, Authentication authentication);
}

實(shí)現(xiàn)類:

@Component("MyRbacService")
public class MyRbacServiceImpl implements MyRbacService {
    private AntPathMatcher antPathMatcher=new AntPathMatcher();
    @Override
    public boolean findAuthority(HttpServletRequest request, Authentication authentication) {
        boolean authority=false;
        if (authentication.getPrincipal() instanceof UserDetails){
            String username = ((UserDetails) authentication.getPrincipal()).getUsername();
            //根據(jù)username去數(shù)據(jù)庫查詢對應(yīng)的url,這里就不查了
            List<String> list =new ArrayList();
            for (String url:list){
                if (antPathMatcher.match(url,request.getRequestURI())){
                    authority=true;
                    break;
                }
            }
            return authority;
        }
        return authority;
    }
}

上面代碼需要在數(shù)據(jù)庫創(chuàng)建用戶表复罐,權(quán)限表,對應(yīng)url表雄家,然后根據(jù)Authentication 里的username信息查找對應(yīng)有權(quán)限的url去與當(dāng)前請求url匹配效诅,因?yàn)檎J(rèn)證篇已經(jīng)講過,用戶認(rèn)證通過之后會把Authentication存在session里,所以認(rèn)證過了Authentication 才會有用戶信息填帽。這里返回類型一定要是boolean蛛淋,然后交給springsecurity處理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末篡腌,一起剝皮案震驚了整個濱河市褐荷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嘹悼,老刑警劉巖叛甫,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杨伙,居然都是意外死亡其监,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門限匣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抖苦,“玉大人,你說我怎么就攤上這事米死⌒坷” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵峦筒,是天一觀的道長究西。 經(jīng)常有香客問我,道長物喷,這世上最難降的妖魔是什么卤材? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮峦失,結(jié)果婚禮上扇丛,老公的妹妹穿的比我還像新娘。我一直安慰自己宠进,他們只是感情好晕拆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著材蹬,像睡著了一般实幕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堤器,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天昆庇,我揣著相機(jī)與錄音,去河邊找鬼闸溃。 笑死整吆,一個胖子當(dāng)著我的面吹牛拱撵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播表蝙,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拴测,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了府蛇?” 一聲冷哼從身側(cè)響起集索,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汇跨,沒想到半個月后务荆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡穷遂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年函匕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚪黑。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡盅惜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祠锣,到底是詐尸還是另有隱情酷窥,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布伴网,位于F島的核電站,受9級特大地震影響妆棒,放射性物質(zhì)發(fā)生泄漏澡腾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一糕珊、第九天 我趴在偏房一處隱蔽的房頂上張望动分。 院中可真熱鬧,春花似錦红选、人聲如沸澜公。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坟乾。三九已至,卻和暖如春蝶防,著一層夾襖步出監(jiān)牢的瞬間甚侣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工间学, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留殷费,地道東北人印荔。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像详羡,于是被迫代替她去往敵國和親仍律。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容