<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 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    spring-security最后一天,今天的主要內容是將需要指定權限才可以訪問的資源放到數據庫中,脫離applicationContext.xml配置文件。然后我們將近兩天學習的srping-security整合到教育辦公系統中。


    我們繼續昨天的內容,將資源文件信息保存到數據庫中。



    1.applicationContext.xml

    將昨天applicationContext.xml“配置SpringSecurityhttp安全服務”部分的內容替換為:

    <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是在調用AUTHENTICATION_PROCESSING_FILTER過濾器之前調用FilterSecurityInterceptor


    2.添加數據表

    resc表與role表是多對多關系。


    1).resc

    image

    2).resc_role

    image

    3.相關類

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

    // 獲取數據Map

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

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

    ConfigAttributeEditor editor = new ConfigAttributeEditor();

    // 轉換數據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接口的實現類如下:

    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

    // 即,任何權限都不可以訪問的頁面!

    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>();

    // 將查詢后的數據拼接并放入到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一下吧!


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


    網站導航:
     
    主站蜘蛛池模板: 亚洲久悠悠色悠在线播放| 亚洲爆乳精品无码一区二区三区| 亚洲人成网站在线播放影院在线| 九九久久精品国产免费看小说| 又大又黄又粗又爽的免费视频| 亚洲暴爽av人人爽日日碰| 在线观看免费为成年视频| 亚洲国产精品免费在线观看| 亚洲AV无码一区东京热久久| 暖暖免费日本在线中文| 亚洲AV日韩精品久久久久| 无码国产精品一区二区免费16 | 99久久精品国产亚洲| 无码精品国产一区二区三区免费| 亚洲好看的理论片电影| 1000部国产成人免费视频| 亚洲va在线va天堂va手机| 搡女人免费视频大全| 亚洲国产精品无码第一区二区三区| 又色又污又黄无遮挡的免费视| 青青免费在线视频| 国产成人亚洲综合无码精品 | 国内精品免费视频精选在线观看| 亚洲色精品vr一区二区三区| 久久大香伊焦在人线免费| 亚洲性色成人av天堂| 中文毛片无遮挡高清免费| 亚洲av色影在线| 国产精品成人免费一区二区| 亚洲成色999久久网站| 蜜臀98精品国产免费观看| 亚洲色大网站WWW永久网站| 亚洲美女在线国产| 久草免费手机视频| 亚洲第一区二区快射影院| 免费在线一级毛片| 一级毛片免费毛片一级毛片免费| 亚洲高清视频在线| 亚洲精品美女久久久久99| 免费精品国产自产拍在线观看图片 | avtt天堂网手机版亚洲|