1.Security概述
-
1.1Spring Security介绍
Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。(https://projects.spring.io/spring-security/) Spring Security 为基于J2EE企业应用软件提供了全面安全服务。特别是使用领先的J2EE解决方案-Spring框架开发的企业软件项目。人们使用Spring Security有很多种原因,不过通常吸引他们的是在J2EE Servlet规范或EJB规范中找不到典型企业应用场景的解决方案。
特别要指出的是他们不能再WAR 或 EAR 级别进行移植。这样,如果你更换服务器环境,就要,在新的目标环境进行大量的工作,对你的应用系统进行重新配置安全。使用Spring Security 解决了这些问题,也为你提供很多有用的,完全可以指定的其他安全特性。 安全包括两个主要操作:
“认证”,是为用户建立一个他所声明的主体。一般式指用户,设备或可以在你系统中执行动作的其他系统。
“授权”,指的是一个用户可以执行哪些操作,在到达授权判断之前,身份的主题已经由身份验证过程建立了。 -
1.2. Spring Security认证
在Spring Security中如果想要进行认证操作,有很多种操作方式,这里我们介绍使用UserDetails、tailsService来完成操作。
public interface UserDetails extends Serializable { Collection<? extends GrantedAuthority>
getAuthorities(); String getPassword();
String getUsername();
boolean
isAccountNonExpired(); boolean isAccountNonLocked(); boolean isCredentialsNonExpired(); boolean isEnabled();
}
UserDetails
UserDetails是一个接口,我们可以 认为UserDetails作用是于封装当前进行认证的用户信息,但由于其是一个 接口,所以我们可以对其进行实现,也可以使用Spring Security提供的UserDetails的实现类User来完成操作
以下是User类的部分代码
public class
User implements UserDetails, CredentialsContainer {
private String
password; private
final
String username;
private final Set<GrantedAuthority> authorities; private final boolean accountNonExpired; //帐户是否过期 private final boolean accountNonLocked; //帐户是否锁定
private
final boolean
credentialsNonExpired; //认证是否过期
private final boolean
enabled; //帐户是否可用
public interface UserDetailsService {
UserDetails loadUserByUsername(String
username) throws UsernameNotFoundException;
}
UserDetailsService规范了我们在做认证时具体执行哪个方法。
2.用户管理 用户登录
- 2.1.导jar包
Pom.xml
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security.version}</version>
</dependency>
- 2.2.配置过滤器
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>
- 2.3.新建spring-security.xml文件
在web.xml中添加classpath
<!-- 配置加载类路径的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext.xml,classpath*:spring-security.xml</param-value>
</context-param>
- 2.4 添加页面
- 2.5.userservice extend UserDetailsService
- 2.6页面端标签控制权限
在jsp页面中我们可以使用spring
security提供的权限标签来进行权限控制 - 导jar包
<%@taglib uri="http://www.springframework.org/security/tags" prefix="security"%>
- 页面导入
- 2.7常用标签
在jsp中我们可以使用以下三种标签,其中authentication代表的是当前认证对象,可以获取当前认证对象信息,例 如用户名。其它两个标签我们可以用于权限控制 - 2.7.1authentication
<security:authentication property="" htmlEscape="" scope=""
var=""/>
-
property:
只允许指定Authentication所拥有的属性,可以进行属性的级联获取,如“principle.username”, 不 允 许 直
接 通 过 方 法 进 行 调 用htmlEscape:表示是否需要将html进行转义。默认为true。
scope:与var属性一起使用,用于指定存放获取的结果的属性名的作用范围,默认我pageContext。Jsp中拥
有的作用范围都进行进行指定
var:
用于指定一个属性名,这样当获取到了authentication的相关信息后会将其以var指定的属性名进行存放,默认是存放在pageConext中 -
2.7.2authorize
authorize是用来判断权限的,通过判断用户是否具有对应的权限而控制其所包含内容的显示
<security:authorize access=""
method=""
url="" var=""></security:authorize>
- access: 需要使用表达式来判断权限,当表达式的返回结果为true时表示拥有对应的权限method:method属性是配合url属性一起使用的,表示用户应当具有指定url指定method访问的权限,method的默认值为GET,可选值为http请求的7种方法
url:url表示如果用户拥有访问指定url的权限即表示可以显示authorize标签包含的内容
var:用于指定将权限鉴定的结果存放在pageContext的哪个属性中