<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 从项目中进行记录============================
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 从项目中进行记录============================