<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配置文件。然后我們將近兩天學習的srping-security整合到教育辦公系統(tǒng)中。


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



    1.applicationContext.xml

    將昨天applicationContext.xml“配置SpringSecurityhttp安全服務”部分的內(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表是多對多關(guān)系。


    1).resc

    image

    2).resc_role

    image

    3.相關(guān)類

    要讓spring-security可以從數(shù)據(jù)庫中獲取相關(guān)資源信息,我們必須編寫一個實現(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);

    }

    }

    // 生成并返回對象

    return new DefaultFilterInvocationDefinitionSource(urlMatcher,

    requestMap);

    }


    @Override

    public Class getObjectType() {

    return null;

    }


    @Override

    public boolean isSingleton() {

    return false;

    }


    }


    其中ResourceDetailsService接口的實現(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() {

    // 注意:這里需要使用左外連接查詢,是因為有些頁面沒有指定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還為我們提供了其他實用的輔助功能,具體的google一下吧!


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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 四虎国产成人永久精品免费| 亚洲aⅴ无码专区在线观看春色| 中国毛片免费观看| 亚洲毛片av日韩av无码| 日韩免费高清一级毛片| 亚洲成片观看四虎永久| 国产黄在线观看免费观看不卡| 亚洲精品线路一在线观看| www一区二区www免费| 永久亚洲成a人片777777| 香蕉免费在线视频| 久久亚洲精品成人| 久久w5ww成w人免费| 亚洲人成电影网站| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 久久综合九色综合97免费下载| 亚洲精品无码成人AAA片| 免费国产成人α片| 亚洲蜜芽在线精品一区| 99在线视频免费| 亚洲乱人伦精品图片| 欧洲黑大粗无码免费| 青青青亚洲精品国产| 77777亚洲午夜久久多人| 久久99国产乱子伦精品免费 | 亚洲毛片基地4455ww| 妞干网在线免费视频| 日日躁狠狠躁狠狠爱免费视频| 亚洲中文字幕无码一区二区三区 | 人禽杂交18禁网站免费| 黄网站色视频免费观看45分钟| 亚洲色大成网站www永久一区| 亚洲午夜免费视频| 老司机亚洲精品影院在线观看| 亚洲综合亚洲综合网成人| 69视频在线观看免费| 亚洲av永久中文无码精品| 曰韩亚洲av人人夜夜澡人人爽| 欧亚精品一区三区免费| 久久久精品视频免费观看| 中文字幕在线观看亚洲日韩|