最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringSecurity實(shí)現(xiàn)動(dòng)態(tài)加載權(quán)限信息的方法

 更新時(shí)間:2022年01月05日 14:50:44   作者:MMM_Demon  
這篇文章主要介紹了SpringSecurity實(shí)現(xiàn)動(dòng)態(tài)加載權(quán)限信息,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定需要的朋友可以參考下

①數(shù)據(jù)庫(kù)中資源與角色對(duì)應(yīng)關(guān)系,以及角色和用戶(hù)對(duì)應(yīng)關(guān)系如下圖所示:

 ②實(shí)現(xiàn)FilterInvocationSecurityMetadataSource類(lèi)

(1)List<Menu> menus = menuService.getMenusWithRoles();這個(gè)是你自己的資源對(duì)應(yīng)角色的查詢(xún)方法。

(2)重寫(xiě)的support方法都返回true

@Configuration
public class MyFilterInvocation implements FilterInvocationSecurityMetadataSource {
 
    @Autowired
    private MenuService menuService;
 
    AntPathMatcher antPathMatcher = new AntPathMatcher();
 
    @Override
    public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
        String requestUrl = ((FilterInvocation) object).getRequestUrl();
        List<Menu> menus = menuService.getMenusWithRoles();
        //- 遍歷數(shù)據(jù)庫(kù)的url,看請(qǐng)求路徑是否與其匹配
        for (Menu menu : menus) {
            //- 如果請(qǐng)求路徑和數(shù)據(jù)庫(kù)的路徑匹配
            if (antPathMatcher.match(menu.getUrl(),requestUrl)){
                //- 訪(fǎng)問(wèn)該路徑需要的角色
                List<Role> roles = menu.getRoles();
                String[] strs = new String[roles.size()];
                for (int i = 0; i < roles.size(); i++) {
                    strs[i] = roles.get(i).getName();
                }
                return SecurityConfig.createList(strs);
            }
        }
        //- 如果請(qǐng)求路徑和數(shù)據(jù)庫(kù)的所有路徑都不匹配,說(shuō)明這個(gè)資源是登錄后即可訪(fǎng)問(wèn)的
        //- 用戶(hù)登錄即可訪(fǎng)問(wèn),相當(dāng)于在SecurityConfig中配置了.anyRequest().authenticated()
        return SecurityConfig.createList("ROLE_LOGIN");
    }
 
    @Override
    public Collection<ConfigAttribute> getAllConfigAttributes() {
        return null;
    }
 
    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }
}

 

 

③實(shí)現(xiàn)AccessDecisionManager類(lèi)

重寫(xiě)的support方法都返回true

@Configuration
public class MyDecisionManager implements AccessDecisionManager {
 
 
    @Override
    public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException {
        for (ConfigAttribute configAttribute : configAttributes) {
            String needRole = configAttribute.getAttribute();
            if ("ROLE_LOGIN".equals(needRole)) {
                //- 用戶(hù)登錄即可訪(fǎng)問(wèn),相當(dāng)于在SecurityConfig中配置了.anyRequest().authenticated()
                if (authentication instanceof AnonymousAuthenticationToken) {
                    throw new AccessDeniedException("尚未登錄,請(qǐng)先登錄");
                } else {
                    return;
                }
            }
            
            Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
            //這里我寫(xiě)的是只要訪(fǎng)問(wèn)該資源的用戶(hù)具有`訪(fǎng)問(wèn)該資源所需要角色`的其中一個(gè)即可
            for (GrantedAuthority authority : authorities) {
                if (authority.getAuthority().equals(needRole)) {
                    return;
                }
            }
        }
        throw new AccessDeniedException("權(quán)限不足,請(qǐng)聯(lián)系管理員");
    }
 
    @Override
    public boolean supports(ConfigAttribute attribute) {
        return true;
    }
 
    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }
}

④到SecurityConfig配置類(lèi)中完成相應(yīng)配置

    @Autowired
    private MyDecisionManager myDecisionManager;
    
    @Autowired
    private  MyFilterInvocation myFilterInvocation;
 
     @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
                    @Override
                    public <O extends FilterSecurityInterceptor> O postProcess(O object) {
                        object.setAccessDecisionManager(myDecisionManager);
                        object.setSecurityMetadataSource(myFilterInvocation);
                        return object;
                    }
                });
 
            http.exceptionHandling().accessDeniedHandler(myAccessDeniedHandler());
 
    }
 
 
    @Bean
    MyAccessDeniedHandler myAccessDeniedHandler(){
        return new MyAccessDeniedHandler();
    }

⑤可選,實(shí)現(xiàn)AccessDeniedHandler類(lèi)

public class MyAccessDenied implements AccessDeniedHandler {
 
    @Override
    public void handle(HttpServletRequest req, HttpServletResponse resp, AccessDeniedException accessDeniedException) throws IOException, ServletException {
        resp.setContentType("application/json;charset=utf-8");
        PrintWriter pw = resp.getWriter();
        pw.write(new ObjectMapper().writeValueAsString(RespBean.error("權(quán)限不夠,請(qǐng)聯(lián)系管理員")));
        pw.flush();
        pw.close();
    }
}

到此這篇關(guān)于SpringSecurity實(shí)現(xiàn)動(dòng)態(tài)加載權(quán)限信息的文章就介紹到這了,更多相關(guān)SpringSecurity動(dòng)態(tài)加載權(quán)限內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于ArrayList初始化長(zhǎng)度的作用及影響

    基于ArrayList初始化長(zhǎng)度的作用及影響

    這篇文章主要介紹了基于ArrayList初始化長(zhǎng)度的作用及影響,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Spring多種加載Bean方式解析

    Spring多種加載Bean方式解析

    本篇文章主要介紹了Spring多種加載Bean方式解析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • java抓取鼠標(biāo)事件和鼠標(biāo)滾輪事件示例

    java抓取鼠標(biāo)事件和鼠標(biāo)滾輪事件示例

    這篇文章主要介紹了java抓取鼠標(biāo)事件和鼠標(biāo)滾輪事件示例,需要的朋友可以參考下
    2014-05-05
  • Java反射(JDK)與動(dòng)態(tài)代理(CGLIB)詳解

    Java反射(JDK)與動(dòng)態(tài)代理(CGLIB)詳解

    下面小編就為大家?guī)?lái)一篇淺談Java反射與動(dòng)態(tài)代理。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-08-08
  • Java中從JSON轉(zhuǎn)Java實(shí)體的多種方法詳解

    Java中從JSON轉(zhuǎn)Java實(shí)體的多種方法詳解

    在現(xiàn)在的日常開(kāi)發(fā)中不管前端還是后端,JSON 格式的數(shù)據(jù)是用得比較多的,甚至可以說(shuō)無(wú)處不在,這篇文章主要給大家介紹了關(guān)于Java中從JSON轉(zhuǎn)Java實(shí)體的多種方法,需要的朋友可以參考下
    2023-12-12
  • springboot 1.5.2 集成kafka的簡(jiǎn)單例子

    springboot 1.5.2 集成kafka的簡(jiǎn)單例子

    本篇文章主要介紹了springboot 1.5.2 集成kafka的簡(jiǎn)單例子 ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • 快速搭建Spring Boot+MyBatis的項(xiàng)目IDEA(附源碼下載)

    快速搭建Spring Boot+MyBatis的項(xiàng)目IDEA(附源碼下載)

    這篇文章主要介紹了快速搭建Spring Boot+MyBatis的項(xiàng)目IDEA(附源碼下載),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 最全LocalDateTime、LocalDate、Date、String相互轉(zhuǎn)化的方法

    最全LocalDateTime、LocalDate、Date、String相互轉(zhuǎn)化的方法

    大家在開(kāi)發(fā)過(guò)程中必不可少的和日期打交道,對(duì)接別的系統(tǒng)時(shí),時(shí)間日期格式不一致,每次都要轉(zhuǎn)化,本文為大家準(zhǔn)備了最全的LocalDateTime、LocalDate、Date、String相互轉(zhuǎn)化方法,需要的可以參考一下
    2023-06-06
  • Java如何通過(guò)反射獲取對(duì)象的屬性和值

    Java如何通過(guò)反射獲取對(duì)象的屬性和值

    這篇文章主要介紹了Java如何通過(guò)反射獲取對(duì)象的屬性和值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • mybatis 多表關(guān)聯(lián)mapper文件寫(xiě)法操作

    mybatis 多表關(guān)聯(lián)mapper文件寫(xiě)法操作

    這篇文章主要介紹了mybatis 多表關(guān)聯(lián)mapper文件寫(xiě)法操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12

最新評(píng)論

商河县| 永修县| 墨脱县| 宁城县| 台东县| 桂林市| 且末县| 资兴市| 德令哈市| 江津市| 普兰店市| 东源县| 商南县| 疏附县| 安图县| 茌平县| 大悟县| 江川县| 涞水县| 江华| 靖边县| 桐庐县| 益阳市| 闽侯县| 天门市| 北宁市| 湛江市| 辽阳市| 沙坪坝区| 镇巴县| 盘锦市| 德令哈市| 辽源市| 宜良县| 乌鲁木齐市| 大理市| 丹江口市| 杂多县| 临沭县| 高州市| 秦安县|