转载自:http://peiquan.blog.51cto.com/7518552/1384168 讲的很有调理也很详细
1.常用的权限控制方法
2.配置
<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>下一步就是在 spring 的配置文件中引入 spring security schema 命名空间,这需要修改原来的application.xml 文件,如下:<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
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">
<!-- 相关配置 -->
</beans>在实际项目的时候,为了区分各种配置,常常会将安全配置单独放到一个文件里(如application-security.xml),同时会使用另外一种命名空间的形式(beans),如下:<?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">
<!-- 相关配置 -->
</beans:beans>接着往下的介绍,我们都使用 beans 命名空间.往下讲解,将从最简单的开始.首先spring security 允许通过 <http> 元素配置 web 应用安全性。假设你的 web 应用的 安全需求是典型的,可以将改元素的 autoconfig 属性设置为 true ,这样 spring security 将自动注册和配置一下几个基本的安全服务。
- 基于表单的登录服务:提供包含用户应用登录表单的默认页面。
- 注销服务:提供一个映射到用于用户退出应用的 url 的处理程序。
- http 基本验证:处理 http 请求头目标中存在的基本验证凭据,还能用于远程协议的 web 服务发出的验证请求。
- 匿名登录:为匿名用户指派一个角色并授予权限,可以将匿名用户作为常规用户处理。
- Remember-me 支持:在多个浏览器会话中记忆用户的身份,通常在用户浏览器中存储一个 Cookie 来实现。
- Servlet API 集成:允许通过标准 Servlet API 如 HttpServletRequest.isUserInRole() 和 HttpServletRequest.getUserPrincipal(),访问 web 应用的安全信息。
<http auto-config='true'><intercept-url pattern="/**" access="ROLE_USER" /></http><!-- 配置认证管理器 -->
<authentication-manager><authentication-provider><user-service><user name="user" password="123456" authorities="ROLE_USER" /></user-service></authentication-provider></authentication-manager>
3、进阶1
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>登录页面</title></head><body><h3>用户登录</h3><form action="/springAuthority/j_spring_security_check" method="post">user:<input type="text" name="j_username"/><br />password:<input type="password" name="j_password" /><input type="submit" value="登录" /></form></body></html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>登录页面</title></head><body><h3>用户登录</h3><form action="${pageContext.request.contextPath}/j_spring_security_check" method="post">user:<input type="text" name="j_username"/><br />password:<input type="password" name="j_password" /><input type="submit" value="登录" /></form></body></html>
<http auto-config="true"><form-login login-page="/login.jsp" /> <!-- 指定登录页面 --><intercept-url pattern="/**" access="ROLE_USER" /></http><!-- 不拦截登录页面,至于为什么加一个 *,是因为请求这个页面的时候可能会带有一些参数 -->
<http pattern="/login.jsp*" security="none" /><http auto-config="true"><form-login login-page="/login.jsp" /> <!-- 指定登录页面 --><intercept-url pattern="/**" access="ROLE_USER" /></http>启动浏览器访问 index.jsp,会发现自动跳转到 login.jsp 页面上了。随即会发现,当输错密码之后,没有错误的提示,怎么办??这时,可以借助spring security 的国际化输出,spring security 框架将所有的错误信息都定义成异常,并提供国际化的资源文件,这个资源文件在spring-security-core-xxx.jar文件中。这时我们需要配置文件中指定使用的资源文件,如下:<!-- 这里定义的messageSource对象供spring security 框架输出异常信息 -->
<bean id="messageSource"class="org.springframework.context.support.ReloadableResourceBundleMessageSource"><property name="basename" value="classpath:/org/springframework/security/messages_zh_CN" /></bean>
<h3>用户登录</h3>${sessionScope.SPRING_SECURITY_LAST_EXCEPTION.message} <!-- 输出异常信息 -->
<form action="${pageContext.request.contextPath}/j_spring_security_check" method="post">user:<input type="text" name="j_username"/><br />password:<input type="password" name="j_password" /><input type="submit" value="登录" /></form>
#你无权访问该资源,请登录AbstractUserDetailsAuthenticationProvider.badCredentials=\u4F60\u65E0\u6743\u8BBF\u95EE\u8BE5\u8D44\u6E90\uFF0C\u8BF7\u767B\u5F55<!-- 用户表 -->
create table users(username varchar_ignorecase(50) not null primary key,password varchar_ignorecase(50) not null,enabled boolean not null); <!-- 是否禁用 -->
<!-- 权限表 -->
create table authorities (username varchar_ignorecase(50) not null,authority varchar_ignorecase(50) not null,constraint fk_authorities_users foreign key(username) references users(username));create unique index ix_auth_username on authorities (username,authority);
<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="username" value="user" /><property name="password" value="root" /><property name="url"value="jdbc:mysql://localhost:3306/car?useUnicode=true&characterEncoding=utf8" /></bean><!-- 配置认证管理器 -->
<authentication-manager><authentication-provider><jdbc-user-service data-source-ref="dataSource"/><!-- <user-service> <user name="user" password="123456" authorities="ROLE_USER" /> </user-service> -->
</authentication-provider></authentication-manager><!-- 不拦截登录页面,至于为什么加一个 *,是因为请求这个页面的时候可能会带有一些参数 -->
<http pattern="/login.jsp*" security="none" /><http auto-config="true"><form-login login-page="/login.jsp" /> <!-- 指定登录页面 --><intercept-url pattern="/**" access="ROLE_USER" /></http><!-- 不拦截登录页面,至于为什么加一个 *,是因为请求这个页面的时候可能会带有一些参数 -->
<http pattern="/login.jsp*" security="none" /><http auto-config="true"><form-login login-page="/login.jsp" /> <!-- 指定登录页面 --><intercept-url pattern="/admin.jsp" access="ROLE_ADMIN"/><intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN" /></http><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>首页</title></head><body>这是首页,欢迎你!<br><a href="admin.jsp">访问admin.jsp</a></body></html>配置完成之后,看下各种效果,如下:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>管理员首页</title></head><body>你好,管理员!!<br></body></html>修改基本满足了我们要求,可 403 信息不太友好,我们可以选择自定义 403 页面,首先还是先新建一个403页面403.jsp,如下:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>403页面</title></head><body>你的访问被拒绝,无权访问该资源<br></body></html>
<!-- 不拦截登录页面,至于为什么加一个 *,是因为请求这个页面的时候可能会带有一些参数 -->
<http pattern="/login.jsp*" security="none" /><http auto-config="true" access-denied-page="/403.jsp"><form-login login-page="/login.jsp" /> <!-- 指定登录页面 --><intercept-url pattern="/admin.jsp" access="ROLE_ADMIN"/><intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN" /></http>
4.获取用户信息
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();if (principal instanceof UserDetails) {String username = ((UserDetails)principal).getUsername();} else {
String username = principal.toString();}
附加信息:
<http auto-config="true" access-denied-page="/403.jsp"><!-- 当系统一直需要用户从首页进入时,可以设置always-use-default-target -->
<form-login login-page="/login.jsp" default-target-url="/index.jsp" always-use-default-target="true"/><intercept-url pattern="/admin.jsp" access="ROLE_ADMIN"/><intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN" /></http>