架构之springsecurity3.1

<http pattern="/login.jsp" security="none" />   表示这些路径,不需要经过过滤器


use-expressions="true" 表示开启<intercept-url pattern="/background/**" access="isAuthenticated()" />中的access为spring EL表达式
如果表达式返回true表示有权限,如果返回false则表示没有权限




access="isAuthenticated()"  如果用户不是匿名用户就会返回true




表达式 说明 
hasRole([role]) 返回 true 如果当前主体拥有特定角色。 
hasAnyRole([role1,role2]) 返回 true 如果当前主体拥有任何一个提供的角色 (使用逗号分隔的字符串队列) 
principal 允许直接访问主体对象,表示当前用户 
authentication 允许直接访问当前 Authentication对象 从SecurityContext中获得 
permitAll 一直返回true 
denyAll 一直返回false 
isAnonymous() 如果用户是一个匿名登录的用户 就会返回 true 
isRememberMe() 如果用户是通过remember-me 登录的用户 就会返回 true 
isAuthenticated() 如果用户不是匿名用户就会返回true 
isFullyAuthenticated() 如果用户不是通过匿名也不是通过remember-me登录的用户时, 就会返回true。 




spring security 3 设置auto-config =true时,会配置十个默认过滤器


自定义过滤器。来替换原有的过滤器
<custom-filter ref="customLogoutFilter" position="LOGOUT_FILTER" /> 
表名用customLogoutFilter过滤器来替换LOGOUT_FILTER过滤器


<!-- 替换默认的LoginFilter -->
<custom-filter ref="customLoginFilter" position="FORM_LOGIN_FILTER" />


custom-filter替换原来的HTTP基本认证Filter。配置自定义custom-filter时必须蔣auto-config="false",不然会报已经存在同样的过滤器错误  


entry-point-ref="myAuthenticationEntryPoint"   entry-point-ref 配置自定义登录界面
如:<!-- 未登录的切入点(未登录时,跳转到登陆界面) -->
    <beans:bean id="myAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
        <beans:property name="loginFormUrl" value="/background/login.html"></beans:property>
    </beans:bean>


access-denied-page="/denied.jsp" 表示无权限时的显示页面。


authentication-manager  认证管理器


<!-- 
登出管理
logout-url 属性:这个指定的URL会触发注销操作,默认是 /j_spring_security_logout
invalidate-session 属性:如果为true,在注销的时候会销毁会话
delete-cookies 属性:以逗号分隔的cookies名称,在用户注销时删除指定的cookies
-->
<logout logout-success-url="/j_spring_security_logout" logout-url="/background/login.html" invalidate-session="true" delete-cookies="JSESSIONID"/>
        
<!-- 实现免登陆验证 
<remember-me  />
-->


<!--
session超时跳转页面 以及每用户可拥有的session最大个数 
如果每次退出后,必须要求用户必须重开浏览器才能登录,可以将 invalid-session-url="/logout.jsp",
防止有些 Web 应用把用户的会话标识符直接通过 URL 的参数来传递        
-->
<!-- 会话管理 -->
<session-management invalid-session-url="/background/login.html" session-fixation-protection="none">
<concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
</session-management>


<!-- 项目使用了自定义登录处理,如果使用security的登录处理,请去掉以下注释 -->
<!--   <custom-filter ref="myLoginFilter" position="FORM_LOGIN_FILTER"  /> -->
<!-- <beans:bean id="myLoginFilter" init-method="init" class="com.lanyuan.security.MyAuthenticationFilter">
<beans:property name="authenticationManager" ref="myAuthenticationManager" />
<beans:property name="filterProcessesUrl" value="/background/j_security_check" />
验证成功后要跳转的URL
<beans:property name="successUrl" value="/background/index.html" />
验证失败后要跳转的URL
<beans:property name="errorUrl" value="/background/login.html" />
</beans:bean> -->




<!--  
     Spring Sercurity要从数据库中获取用户、权限、资源来实现权限管理,需要自定义过滤器,
     并且该过滤器必须在spring Security执行FILTER_SECURITY_INTERCEPTOR过滤器之前执行,
     因为该框架实现权限管理实质就是在执行action之前先执行它框架中的为权限管理制定的一系列Fliter。
  我们自定的这个SercurityFilter类要继承AbstractSecurityInterceptor 接口和Filter类(负责传递一系列的Filter),
  因为我们是从数据库中获取权限验证的数据,所以还要重写FilterInvocationSecurityMetadataSource 接口,
AccessDecisionManager 接口,UserDetailsService 接口,只要重写了这3个接口,
然后再spring配置文件中做相应的配置,项目启动启动后,我们进行资源请求,就自动会去执行我们重定义的类进行权限判断。


       -->
        <custom-filter ref="mySecurityFilter" before="FILTER_SECURITY_INTERCEPTOR"/>


public class MySecurityMetadataSource implements FilterInvocationSecurityMetadataSource //加载资源与权限的对应关系


public class MyUserDetailServiceImpl implements UserDetailsService {//加载用户和权限的关系


public class MyAccessDecisionManager implements AccessDecisionManager {//对请求的资源进行判断


public class MyAuthenticationFilter extends UsernamePasswordAuthenticationFilter//自定义登陆验证的过滤器




<!-- 实现了UserDetailsService的Bean 用户拥有的权限:登录后取得用户所保有的权限信息
    //认证管理器 获得用户和权限的关系。  
    -->
<authentication-manager alias="myAuthenticationManager">
<authentication-provider user-service-ref="myUserDetailServiceImpl" />
</authentication-manager>


========================spring security 从项目中进行记录============================
a 开始进行springsecurity时,需要添加jar。


b 之后在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>/background/*</url-pattern>
    </filter-mapping>


c 之后在src下添加springsecurity必须有的配置文件(配置文件放在哪,无所谓,关键是在web.xml中能加载上即可)
<?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" /><!-- 过滤这些文件,不需要进行保护-->
    <http pattern="/denied.jsp" security="none" />
    <http pattern="/background/login.action" security="none" />
    <http pattern="/background/loginCheck.action" security="none"/>
    
    <!-- spring security 相关的配置,
    use-expressions="true" 表示使用spring EL表达式(access="isAuthenticated()")
    auto-config="false" 不使用默认过滤器,如果需要自定义过滤器来替换已有的过滤器,则需要将auto-config属性设置为false
    entry-point-ref="myAuthenticationEntryPoint"为自定义登陆界面。
    access-denied-page="/denied.jsp"为没有权限时的提示界面
    -->
    <http use-expressions="true" auto-config="false" entry-point-ref="myAuthenticationEntryPoint" access-denied-page="/denied.jsp">
        <!-- intercept-url表示这些配置的路径,需要验证才行(isAuthenticated()表示需要登陆验证通过才能访问)-->
<intercept-url pattern="/background/**" access="isAuthenticated()" />


<!-- 退出时的配置-->
        <logout logout-success-url="/j_spring_security_logout" logout-url="/background/login.action" invalidate-session="true" delete-cookies="JSESSIONID"/>
         
<!-- session会话管理,可以配置session超时时的显示的界面,同时也可以配置是否只容许同时1个人在线
invalid-session-url="/background/login.action" session超时时的显示界面-->
        <session-management invalid-session-url="/background/login.action" session-fixation-protection="none">
            
   <!-- 配置是否只容许同时1个人在线-->
   <concurrency-control max-sessions="1"
                error-if-maximum-exceeded="true" />
        </session-management>
        
<!--自定义过滤器,如果用户、权限(角色)、资源都存放在数据库中,这时需要配置这个自定义过滤器,
必须在FILTER_SECURITY_INTERCEPTOR之前。该定义的过滤器采用spring MVC的注解方式进行注册的。
在程序中需要自定义四个接口:因为该框架实现权限管理实质就是在执行action之前先执行它框架中的为权限管理制定的一系列Fliter。
  我们自定的这个SercurityFilter类要继承AbstractSecurityInterceptor 接口和Filter类(负责传递一系列的Filter),
  因为我们是从数据库中获取权限验证的数据,所以还要重写FilterInvocationSecurityMetadataSource 接口,
AccessDecisionManager 接口,UserDetailsService 接口,只要重写了这3个接口,
然后再spring配置文件中做相应的配置,项目启动启动后,我们进行资源请求,就自动会去执行我们重定义的类进行权限判断。-->
        <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="/background/login.action"></beans:property>
    </beans:bean>
    
    <!--用户和权限的管理,使用springMVC的注解方式进行注册的。-->
    <authentication-manager alias="myAuthenticationManager">
        <authentication-provider user-service-ref="myUserDetailServiceImpl" />
    </authentication-manager>
    
</beans:beans>


d: 添加4个接口类。可以参考testSpringSecurity6的com.zbeninfo.web_new.security下的四个类:
MyAccessDecisionManager.java
MySecurityFilter.java
MySecurityMetadataSource.java
MyUserDetailServiceImpl.java


e:用数据库中间件(如ibatis,写好相关联的数据库脚本。可以参考testSpringSecurity6)


f:springsecurity可以自定义登陆界面的登陆验证:
如:<form name="loginForm" method="post" action="${pageContext.servletContext.contextPath }/background/loginCheck.action">
@Controller
@RequestMapping ("/background/")
public class BackgroundController
{
@RequestMapping ("loginCheck")
public String loginCheck(String username,String password,HttpServletRequest request){
try {
if (!request.getMethod().equals("POST")) {
request.setAttribute("error","支持POST方法提交!");
}
if (Common.isEmpty(username) || Common.isEmpty(password)) {
request.setAttribute("error","用户名或密码不能为空!");
return "/background/framework/login";
}
// 验证用户账号与密码是否正确
User users = this.userDao.querySingleUser(username);
if (users == null || !users.getUserPassword().equals(password)) {
request.setAttribute("error", "用户或密码不正确!");
   return "/background/framework/login";
}
Authentication authentication = myAuthenticationManager
.authenticate(new UsernamePasswordAuthenticationToken(username,password));
SecurityContext securityContext = SecurityContextHolder.getContext();
securityContext.setAuthentication(authentication);
HttpSession session = request.getSession(true);  
   session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext);  
   // 当验证都通过后,把用户信息放在session里
request.getSession().setAttribute("userSession", users);
} catch (AuthenticationException ae) {  
request.setAttribute("error", "登录异常,请联系管理员!");
   return "/background/framework/login";
}
return "redirect:index.action";
}
}
========================spring security 从项目中进行记录============================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值