<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 78, comments - 34, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    spring-security最后一天,今天的主要內(nèi)容是將需要指定權(quán)限才可以訪問的資源放到數(shù)據(jù)庫中,脫離applicationContext.xml配置文件。然后我們將近兩天學(xué)習(xí)的srping-security整合到教育辦公系統(tǒng)中。


    我們繼續(xù)昨天的內(nèi)容,將資源文件信息保存到數(shù)據(jù)庫中。



    1.applicationContext.xml

    將昨天applicationContext.xml“配置SpringSecurityhttp安全服務(wù)”部分的內(nèi)容替換為:

    <sec:http auto-config="true" session-fixation-protection="none" />

    <bean

    class="org.springframework.security.intercept.web.FilterSecurityInterceptor"

    autowire="byType">

    <sec:custom-filter before="AUTHENTICATION_PROCESSING_FILTER"/>

    <property name="objectDefinitionSource" ref="objectDefinitionSource"/>

    </bean>

    這里的objectDefinitionSource是下邊的類,cutom-filter是在調(diào)用AUTHENTICATION_PROCESSING_FILTER過濾器之前調(diào)用FilterSecurityInterceptor


    2.添加數(shù)據(jù)表

    resc表與role表是多對(duì)多關(guān)系。


    1).resc

    image

    2).resc_role

    image

    3.相關(guān)類

    要讓spring-security可以從數(shù)據(jù)庫中獲取相關(guān)資源信息,我們必須編寫一個(gè)實(shí)現(xiàn)FactoryBean接口的類。

    package cn.itcast.cc.spring.security;


    import java.util.LinkedHashMap;

    import java.util.Map;

    import javax.annotation.Resource;

    import org.springframework.beans.factory.FactoryBean;

    import org.springframework.security.ConfigAttributeDefinition;

    import org.springframework.security.ConfigAttributeEditor;

    import org.springframework.security.intercept.web.DefaultFilterInvocationDefinitionSource;

    import org.springframework.security.intercept.web.RequestKey;

    import org.springframework.security.util.AntUrlPathMatcher;

    import org.springframework.security.util.UrlMatcher;

    import org.springframework.stereotype.Component;


    @Component("objectDefinitionSource")

    public class DefaultFilterInvocationDefinitionSourceImpl implements FactoryBean {


    @Resource

    ResourceDetailsService resourceDetailsService;


    private UrlMatcher getUrlMatcher() {

    UrlMatcher urlMatcher = new AntUrlPathMatcher();

    return urlMatcher;

    }


    @Override

    public Object getObject() throws Exception {

    UrlMatcher urlMatcher = this.getUrlMatcher();

    // 獲取數(shù)據(jù)Map

    Map<String, String> srcMap = resourceDetailsService.buildRequestMap();

    LinkedHashMap<RequestKey, Object> requestMap = new LinkedHashMap<RequestKey, Object>();

    ConfigAttributeEditor editor = new ConfigAttributeEditor();

    // 轉(zhuǎn)換數(shù)據(jù)Map

    for (Map.Entry<String, String> entry : srcMap.entrySet()) {

    String url = entry.getKey();

    String roles = entry.getValue();

    if (roles != null) {

    editor.setAsText(roles);

    requestMap.put(new RequestKey(url), editor.getValue());

    } else {

    requestMap.put(new RequestKey(url), ConfigAttributeDefinition.NO_ATTRIBUTES);

    }

    }

    // 生成并返回對(duì)象

    return new DefaultFilterInvocationDefinitionSource(urlMatcher,

    requestMap);

    }


    @Override

    public Class getObjectType() {

    return null;

    }


    @Override

    public boolean isSingleton() {

    return false;

    }


    }


    其中ResourceDetailsService接口的實(shí)現(xiàn)類如下:

    package cn.itcast.cc.spring.security;


    import java.util.HashMap;

    import java.util.List;

    import java.util.Map;

    import javax.annotation.Resource;

    import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;

    import org.springframework.stereotype.Component;


    @Component("userDetailsService")

    public class ResourceDetailsServiceImpl implements ResourceDetailsService {


    @Resource

    private SimpleJdbcTemplate jdbcTemplate;

    @Override

    public Map<String, String> buildRequestMap() {

    // 注意:這里需要使用左外連接查詢,是因?yàn)橛行╉撁鏇]有指定role

    // 即,任何權(quán)限都不可以訪問的頁面!

    String sql = "SELECT res_string as url,r.name as role " +

    "FROME resc LEFT JOIN resc_role rr ON rr.resc_id = resc.id " +

    "LEFT JOIN role r ON rr.role_id = r.id";

    List<Map<String, Object>> results = this.jdbcTemplate.queryForList(sql);

    Map<String, String> srcMap = new HashMap<String, String>();

    // 將查詢后的數(shù)據(jù)拼接并放入到Map

    for(Map<String,Object> val:results){

    String url = (String) val.get("url");

    String role = (String) val.get("role");

    if(srcMap.containsKey(url)){

    role = srcMap.get(url) + "," + role;

    }

    srcMap.put(url, role);

    }

    return srcMap;

    }

    }


    Spring-security還為我們提供了其他實(shí)用的輔助功能,具體的google一下吧!


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲a一级免费视频| 日本免费人成黄页在线观看视频 | 免费人成视频在线播放| 国产乱子精品免费视观看片| 亚洲AV无码第一区二区三区| 国产精品99精品久久免费| 久久久青草青青国产亚洲免观| 日韩在线视频免费| 国内精品久久久久久久亚洲| 国产精品无码免费专区午夜| 亚洲中文字幕日产乱码高清app| 国产国产人免费人成成免视频| 亚洲毛片网址在线观看中文字幕| 乱淫片免费影院观看| 亚洲综合色在线观看亚洲| 国产中文字幕在线免费观看| 亚洲成a人片在线观看无码| 亚欧日韩毛片在线看免费网站| 久久精品国产亚洲AV高清热| 免费三级毛片电影片| 亚洲一区二区观看播放| 最好免费观看韩国+日本| 免费一区二区无码视频在线播放| 国产亚洲色视频在线| 99蜜桃在线观看免费视频网站| 亚洲一卡二卡三卡| 午夜国产大片免费观看| 中文字幕免费观看全部电影| 亚洲网址在线观看| 国产成人精品免费视频大全五级| 国产精品免费αv视频| 亚洲视频中文字幕在线| 国产精品另类激情久久久免费| GOGOGO免费观看国语| 亚洲小说图片视频| 亚洲av日韩片在线观看| 精品一区二区三区无码免费视频| 亚洲免费综合色在线视频| 国产亚洲AV无码AV男人的天堂| 在线观看无码AV网站永久免费 | 亚洲欧洲精品无码AV|