架构之springSecurity_3.1

1 架构中所用的权限系统为SpringSecurity3.1版本。jar为:
spring-security-acl-3.1.3.RELEASE.jar
spring-security-config-3.1.3.RELEASE.jar
spring-security-core-3.1.3.RELEASE.jar
spring-security-taglibs-3.1.3.RELEASE.jar
spring-security-web-3.1.3.RELEASE.jar


2 SpringSecurity3.1需要在web.xml中进行配置。
如:filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>
            org.springframework.web.filter.DelegatingFilterProxy
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


3 SpringSecurity3.1需要有配置文件。
如:<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-3.1.xsd">
    
    <http pattern="/login.jsp" security="none" /><!-- 配置这些路径的url不过滤-->
    <http pattern="/index.jsp" security="none" /><!-- 配置这些路径的url不过滤-->
    <http pattern="/denied.jsp" security="none" /><!-- 配置这些路径的url不过滤-->
    <http pattern="/login.action*" security="none" /><!-- 配置这些路径的url不过滤-->
    
    <!-- 注册相关的url start -->
    <http pattern="/register.jsp" security="none" /><!-- 配置这些路径的url不过滤-->
    <http pattern="/selectJg.jsp" security="none" /><!-- 配置这些路径的url不过滤-->
    <http pattern="/jsp/common.jsp" security="none" /><!-- 配置这些路径的url不过滤-->
    <!-- 注册相关的url end -->
    
    <http pattern="/**/*.jpg" security="none" /><!-- 配置这些路径的url不过滤-->
    <http pattern="/**/*.css" security="none" /><!-- 配置这些路径的url不过滤-->
    <http pattern="/**/*.xml" security="none" /><!-- 配置这些路径的url不过滤-->
    <http pattern="/**/*.swf" security="none" /><!-- 配置这些路径的url不过滤-->
    <http pattern="/**/*.zip" security="none" /><!-- 配置这些路径的url不过滤-->
    <http pattern="/**/*.gif" security="none" /><!-- 配置这些路径的url不过滤-->
    <http pattern="/**/*.png" security="none" /><!-- 配置这些路径的url不过滤-->
    <http pattern="/**/*.js" security="none" /><!-- 配置这些路径的url不过滤-->
    
    <http use-expressions="true" auto-config="false" entry-point-ref="myAuthenticationEntryPoint" access-denied-page="/denied.jsp">
        <intercept-url pattern="/**" access="isAuthenticated()" />
        <logout logout-success-url="/j_spring_security_logout" logout-url="/login.action?method=login" invalidate-session="true" delete-cookies="JSESSIONID"/>
         
        <session-management invalid-session-url="/login.action?method=login" session-fixation-protection="none">
            <concurrency-control max-sessions="1"
                error-if-maximum-exceeded="true" />
        </session-management>
        
        <custom-filter ref="mySecurityFilter" before="FILTER_SECURITY_INTERCEPTOR"/>
         
    </http>
    
    <beans:bean id="myAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
        <beans:property name="loginFormUrl" value="/login.action?method=login"></beans:property>
    </beans:bean>
    
    <authentication-manager alias="myAuthenticationManager">
        <authentication-provider user-service-ref="myUserDetailServiceImpl" />
    </authentication-manager>
    
</beans:beans>


解释:
<http pattern="/**/*.jpg" security="none" />
表示所有的jpg结尾的文件都不经过springSecurity过滤器。


<http pattern="/login.action*" security="none" />
表示所有url中以login.action开头的都不经过springSecurity过滤器。


use-expressions="true"
true表示可以使用spring表达式。


auto-config="false"
true表示使用默认的过滤器


entry-point-ref="myAuthenticationEntryPoint"
表示指定的入口,就是登陆入口。入口是这个ref。这个ref要配置loginFormUrl属性。


access-denied-page="/denied.jsp"
表示如果访问的界面没有权限访问时则跳转到这个界面


<intercept-url pattern="/**" access="isAuthenticated()" />
表示拦截所有的url。所有的url都不能匿名访问。都需要有权限才能访问。


<logout logout-success-url="/j_spring_security_logout" logout-url="/login.action?method=login" invalidate-session="true" delete-cookies="JSESSIONID"/>
设置注销的配置。注销的url为/j_spring_security_logout。注销之后跳转的url为:/login.action?method=login。invalidate-session表示注销时是否删除session


<session-management invalid-session-url="/login.action?method=login" session-fixation-protection="none">
            <concurrency-control max-sessions="1"
                error-if-maximum-exceeded="true" />
        </session-management>
session的配置。invalid-session-url表示如果session过期则跳转到/login.action?method=login这个url。(遗留一个问题:如何控制一个账号只能同时登陆一次,还没有解决)


<custom-filter ref="mySecurityFilter" before="FILTER_SECURITY_INTERCEPTOR"/>
这个是自定义的过滤器,配置的说明表示:在FILTER_SECURITY_INTERCEPTOR这个过滤器之前执行。
自定义的过滤器则是程序中控制的权限系统的核心:会有读取用户和用户资源、通过当用户访问某一个url时,判断是否有访问的权限。这是重点


<beans:bean id="myAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
        <beans:property name="loginFormUrl" value="/login.action?method=login"></beans:property>
    </beans:bean>
这就是默认的登陆入口,如果没有登陆过则会跳转到这个登陆入口登陆,配置了loginFormUrl属性为登陆的url。


<authentication-manager alias="myAuthenticationManager">
        <authentication-provider user-service-ref="myUserDetailServiceImpl" />
    </authentication-manager>
这个是用来读取用户和资源所对应的资源key的。


4 下面详细讲解自定义过滤器:MySecurityFilter这个就是自定义的过滤器。
如:@Service
public class MySecurityFilter extends AbstractSecurityInterceptor implements Filter{




}
使用spring注解的方式(@Service)就可以不用再配置文件中进行配置了。


5这个自定义的过滤器会有三个属性(这三个属性的前两个是通过spring的注解方式,不同在配置文件中配置):
@Autowired
    private MySecurityMetadataSource mySecurityMetadataSource;
    
    @Autowired
    private MyAccessDecisionManager myAccessDecisionManager;
    
    @Autowired
    private AuthenticationManager myAuthenticationManager;


如:
这个是为了读取资源的url和资源url所对应的urlkey值的
@Service
public class MySecurityMetadataSource implements FilterInvocationSecurityMetadataSource{


}


这个是为了每次访问一个url是,判断用户是否有这个url。
@Service
public class MyAccessDecisionManager implements AccessDecisionManager {


}


6 @Autowired
    private AuthenticationManager myAuthenticationManager;是通过系统中配置的(这个类是springSecurity自带的,我们不用重新定义和覆盖)。用来配置读取用户和资源的urlkey对应的值。他有一个属性user-service的类,需要我们自定义。那就是myUserDetailServiceImpl这个类。
如:@Service
public class MyUserDetailServiceImpl implements UserDetailsService{


}


<authentication-manager alias="myAuthenticationManager">
        <authentication-provider user-service-ref="myUserDetailServiceImpl" />
    </authentication-manager>




总结程序中所定义的自定义过滤器和他所要实现的三个属性:
自定义过滤器:MySecurityFilter
他有三个属性:  private MySecurityMetadataSource mySecurityMetadataSource;
private MyAccessDecisionManager myAccessDecisionManager;
private AuthenticationManager myAuthenticationManager;(对应的是MyUserDetailServiceImpl)
这四个类都添加了spring的service注解。
在MySecurityFilter中三个属性都添加了@Autowired注解。
最后在springsecurity的配置文件中要将AuthenticationManager 和MyUserDetailServiceImpl对应起来。
这样就形成了一个自定义完成的过滤器了。


7 控制菜单级的权限,可以通过配置url有哪些。和正常的应用系统相同:系统已开始,用户登陆之后,能有权限能访问的url则会通过程序或代码显示在界面上,分为一级、二级、三级。


8 控制按钮级的权限呢。则需要通过springSecurity的sec标签。
如:首先需要引入:
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> 


然后再需要控制的按钮前后加上sec:authorize标签,然后ifAnyGranted属性赋予所配置的按钮所对应的urlKey:
<sec:authorize ifAnyGranted='ROLE_sys_user_chaxun'>
  <input type="button" class="easyui-linkbutton btn_css" id="dd" value="查询" οnclick="btn_cx_click()"/>
</sec:authorize>


9 菜单级按钮还可以通过js拼接的方式。在datagrid中的一列可以这么控制按钮级别。
如:{field:"ab",title:"基本操作",formatter:function(value,rowData,rowIndex){
                    //return "<input type='button' id='button_"+rowIndex+"' value='button'/>";
                    //var jiaose="<img src='./images/role.png' width='16' height='16' /><a href='javascript:void(0);' οnclick='userRole('"+userId+"')'>分配角色</a>";
                    var jiaose="<sec:authorize ifAnyGranted='ROLE_sys_user_fenpeirole'><img src='./images/role.png' width='16' height='16' /><a href='javascript:void(0);' οnclick=\"userRole('"+rowData.userId+"')\">分配角色</a></sec:authorize>";
                    var quanxian="<sec:authorize ifAnyGranted='ROLE_sys_user_permissions'><img src='./images/resc.png' width='16' height='16' /><a href='javascript:void(0);' οnclick=\"permissio('"+rowData.userId+"')\">分配权限</a></sec:authorize>";
                    var edit_js="<sec:authorize ifAnyGranted='ROLE_sys_user_edit'><img src='./images/resc.png' width='16' height='16' /><a href='javascript:void(0);' οnclick=\"fun_edit_js('"+rowData.userId+"')\">编辑</a></sec:authorize>";
                    var delete_js="<sec:authorize ifAnyGranted='ROLE_sys_user_delete'><img src='./images/resc.png' width='16' height='16' /><a href='javascript:void(0);' οnclick=\"fun_delete_js('"+rowData.userId+"')\">删除</a></sec:authorize>";
                    
                    return jiaose+"&nbsp;&nbsp;"+edit_js+"&nbsp;&nbsp;"+delete_js;
                    //return rowData.userId;
                }}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值