折腾了一天终于把spring security 3.1.0集成进项目中了,这里特别说明了一下版本,因为不同的版本有些用法会存在一些差异。期间遇到了很多问题,记录在这里。
最大的心得是网上的资料只能参考,最重要的文档是spring security自带的tutorial的例子,这里的用法是和你要用到的版本是一致的。
<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">
<!--网上有些版本的用法是把这些配置和intercept-url配置放在一起,并且是filters=none,这种配置这个版本不支持-->
<!-- 不要过滤图片等静态资源,其中**代表可以跨越目录,*不可以跨越目录。-->
<http pattern="/**/*.jpg" security="none" />
<http pattern="/**/*.png" security="none" />
<http pattern="/**/*.gif" security="none" />
<http pattern="/**/*.css" security="none" />
<http pattern="/**/*.js" security="none" />
<!-- 登录页面不过滤 -->
<http pattern="/login.jsp" security="none" />
<!--网上会看到很多access="ROLE_XXX"的配置,这是因为没有用到表达式,即use-expressions没有配置
另外一个问题就是一旦用了表达式,上面这种配置就不能工作,会报非法参数异常。 必须改成hasRole这种
模式的配置
-->
<http auto-config="true" use-expressions="true" access-denied-page="/error.jsp">
<intercept-url pattern="/main/**" access="isAuthenticated()" />
<!--注意角色的命名也必须是ROLE_前缀开头,好像可以配置,但是我没找到-->
<intercept-url pattern="/employee/**" access="hasRole('ROLE_ADMIN')" />
<!--form-login配置了以后spring security会处理authentication的过程, 但注意这里的一些命名约定
前端jsp的form表单的submit的地址(j_spring_security_check可以配置),用户名j_username和密码j_password的命名等。这个都可以在tutorial的例子里面找到
-->
<form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?error=true" default-target-url="/main/mainframe.do" />
<!--logout配置基本上跟login的差不多,这里logour-url可以不配,默认的是j_spring_security_logout-->
<logout logout-success-url="/login.jsp" delete-cookies="JSESSIONID" logout-url="/logout.do"/>
<remember-me />
<!-- session超时后重定向的登陆页面 -->
<session-management invalid-session-url="/login.jsp" />
</http>
<!--
Usernames/Passwords are
rod/koala
dianne/emu
scott/wombat
peter/opal
-->
<!-- 注意能够为authentication-manager 设置alias别名,这里因为我的表结构和spring security提供的
不一样,所以需要重新实现-->
<authentication-manager alias="authenticationManager">
<authentication-provider user-service-ref="userDetailsManager">
</authentication-provider>
</authentication-manager>
</beans:beans>
需要补充以下几个问题
1. 注释中提到如果配置了表达式,<intercept-url pattern="/employee/**"access="ROLE_ADMIN" /> 这种形式的配置会报以下异常
java.lang.IllegalArgumentException: Failed to evaluate expression 'ROLE_ADMIN'
org.springframework.security.access.expression.ExpressionUtils.evaluateAsBoolean(ExpressionUtils.java:13)
org.springframework.security.web.access.expression.WebExpressionVoter.vote(WebExpressionVoter.java:34)
org.springframework.security.web.access.expression.WebExpressionVoter.vote(WebExpressionVoter.java:18)
org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:50)
org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:204)
解决办法就是如上配置文件改成hasRole的形式。
2. 关于数据库表和spring security不一致的实现。 表结构大致如下
/*员工角色*/
create table if not exists myrole (
roleid int unsigned not null auto_increment,
rolename varchar(10) not null,
issystem bit not null default 0,
authorities text,
primary key (roleid)
)engine=innodb
default charset=utf8;
/*员工基本信息*/
create table if not exists employee (
username varchar(30) not null,
password varchar(30) not null,
realname varchar(30),
cellphone varchar(20),
email varchar(30),
status bit not null,
primary key (username)
)engine=innodb
default charset=utf8;
/*员工角色对应表*/
create table if not exists employee_role_conn (
username varchar(30) not null,
roleid int unsigned not null,
primary key (username, roleid),
foreign key (username) references employee(username),
foreign key (roleid) references myrole(roleid)
)engine=innodb
default charset=utf8;
spring security3提供的接口是UserDetails和 UserDetailsService.所以首先需要领域对象中的Employee实现UserDetails, 然后用一个UserDetailsService的实现类去从数据库中获取Employee的信息。 下面是部分代码
public class Employee implements UserDetails, Serializable {
private String username;
private String password;
private String realname;
private String cellphone;
private String email;
private boolean status; //是否离职 true 在职 false 离职
private List<EmployeeRole> roles;
private Set<GrantedAuthority> authorities;// 所有的权限信息
}
public class UserDetailServiceImpl implements UserDetailsService {
private EmployeeMapper employeeMapper;
@Resource(name = "employeeMapper")
public void setEmployeeMapper(EmployeeMapper employeeMapper) {
this.employeeMapper = employeeMapper;
}
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Employee admin = null;
try {
admin = employeeMapper.getEmployeeById(username);
} catch (Exception ex) {
Logger.getLogger(UserDetailServiceImpl.class.getName()).log(Level.SEVERE, null, ex);
}
if (admin == null) {
throw new UsernameNotFoundException("管理员[" + username + "]不存在!");
}
admin.setAuthorities(getGrantedAuthorities(admin));
return admin;
}
private Set<GrantedAuthority> getGrantedAuthorities(Employee admin) {
Set<GrantedAuthority> grantedAuthorities = new HashSet<GrantedAuthority>();
for (EmployeeRole role : admin.getRoles()) {
for (String authority : role.getAuthorityList()) {
grantedAuthorities.add(new SimpleGrantedAuthority(authority));
}
}
return grantedAuthorities;
}
}
3. spring security jsp页面的标签库
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
4. 在jsp页面中使用<sec:authorization>标签时,如果需要判断多个条件的正确写法
老版本的spring security中有这种用法
<sec:authorize ifAnyGranted="ROLE_XXX,ROLE_YYY">
这种用法在spring security3中是deprecated.那么怎么写出这种等价的用法,经过试验,下面这种写法可以工作
<sec:authorize access="hasRole('ROLE_XXX) OR hasRole('ROLE_YYY')">
注意配置文件中必须设置use-expressions为true,这在spring security3的文档中说明了的
5. spring security3和sitemesh共同使用的问题(项目中没用到,先记录在这里)
结论是:
与filter mapping的配置顺序有关,spring security3的必须放在sitemesh的前面
分享到:
相关推荐
Spring Security 3 配置和使用 Spring Security 是一个强大且灵活的安全框架,旨在保护基于 Java 的 Web 应用程序。Spring Security 3 是 Spring Security 框架的第三个主要版本,提供了许多新的功能和改进。下面...
教程文档`教你使用_SpringSecurity_3.0_52页.pdf`会详细指导你如何一步步配置和使用Spring Security。它应该包含了配置文件的示例、如何集成到Spring应用中、如何创建自定义认证逻辑以及如何进行授权设置等内容。...
本教程将深入探讨Spring Security的基本使用和配置代码,帮助你理解和实践这个框架。 首先,Spring Security的核心功能包括用户身份验证、权限控制以及安全相关的会话管理。在开始配置之前,确保你的项目已经集成了...
在提供的压缩包`springsecurity配置demo`中,你将找到示例代码和详细说明,这将帮助你更好地理解和实践上述概念。通过学习和实践这些示例,你将能够为自己的Spring应用程序构建强大的安全防护。
### Spring Security3 配置与使用详解 #### 一、Spring Security3 概览 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。最初由 Ben Alex 在 2003 年创建,名为 "The Acegi Security System...
- `Config-spring-security-config.jar`:支持基于 XML 和 Java 的安全配置。 - `LDAP-spring-security-ldap.jar`:支持 LDAP 认证和授权。 - `ACL-spring-security-acl.jar`:提供了基于 ACL 的访问控制功能。 ...
10. **国际化支持**:对于多语言应用,可以配置Spring Security的错误消息和登录提示的国际化。 在实际项目中,我们还需要根据业务需求进行调整,比如集成OAuth2、SAML等身份验证协议,或者自定义认证和授权流程。...
在Spring Security 3中,你可以看到如何配置和使用Remember-Me服务,以便为用户提供更加便捷的登录体验。 7. **集成其他Spring组件**:Spring Security 可以与Spring MVC、Spring Data等其他Spring组件无缝集成。...
总结来说,Spring Security XML配置涉及到的主要知识点包括:`<http>`元素的设置、拦截URL的配置、`<authentication-manager>`和`<authentication-provider>`的使用、自定义登录表单的实现以及Spring MVC和Bootstrap...
这三份资料——"实战Spring Security 3.x.pdf"、"Spring Security 3.pdf" 和 "Spring Security使用手册.pdf" 将深入探讨这些概念,并提供实践指导,帮助读者掌握如何在实际项目中应用Spring Security。通过学习这些...
1. **XML配置**: 在Spring Security 3中,主要使用XML配置来定义安全设置。这包括定义过滤器链、认证提供者、访问决策策略等。例如,`<http>`元素用于配置URL保护,`<authentication-manager>`用于定义认证策略。 2...
- Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和AccessDecisionManager。 - 使用@Secured和@PreAuthorize注解进行方法级别的...
该章节分为两个部分,介绍了Spring Security3的基础概念,包括如何设置安全上下文、理解Spring Security的架构以及如何使用Spring Security进行基本的认证和授权。 ### 第二章:深入理解Spring Security3 本章深入...
3. **配置Spring Security核心组件**:创建一个名为`security-config.xml`的配置文件,定义过滤器链、认证和授权规则。例如,使用`http`元素来定义URL匹配规则,`form-login`和`logout`元素配置登录和登出行为。 4....
在本文中,我们将介绍如何使用 SpringBoot 和 Spring Security 实现基本的认证和授权功能,并且实现个性化的登录配置。 一、Spring Security 简介 Spring Security 是一个基于 Spring 框架的安全框架,它提供了...
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理。它为Web应用程序提供了全面的身份验证、授权和访问...在实际项目中,结合具体需求,正确配置和使用Spring Security,能有效提高应用程序的安全性。
入门阶段主要是了解Spring Security的基本概念和配置方法。进阶阶段需要深入学习如何定制认证和授权流程、如何集成各种认证方式以及如何在实际项目中进行应用。高级阶段则涉及框架的原理深入、性能优化、安全漏洞的...
Spring Security 3作为该框架的一个版本,提供了丰富的安全性配置选项,涵盖了从基础的认证和授权到复杂的单点登录和方法保护等各个方面。 ### 基础篇 #### Hello World示例 Spring Security的入门通常以一个简单...
在"spring security2.5 jar"中,包含了Spring Security框架的核心类和接口,这些类和接口定义了安全控制的基本机制。比如: 1. **认证**:这是验证用户身份的过程,Spring Security提供了多种认证方式,如基于表单...