最近公司要做开发平台,对安全要求比较高;SPRING SECURTIY框架刚好对所有安全问题都有涉及,框架的作者最近还做了spring-session项目实现分布式会话管理,还有他的另一个开源项目spring-security-oauth2。
关于spring-security的配置方法,网上有非常多的介绍,大都是基于XML配置,配置项目非常多,阅读和扩展都不方便。其实spring-security也有基于java的配置方式,今天就讲讲如何通过java配置方式,扩展spring-security实现权限配置全部从表中读取。
直接上代码:
application.properties配置文件
privilesByUsernameQuery= select authority from user_authorities where username = ?
allUrlAuthoritiesQuery=SELECT authority_id , url FROM Url_Authorities
javaconfig
/**
*
*/
package com.sivalabs.springapp.config;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
//import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.util.StringUtils;
import com.sivalabs.springapp.entities.UrlAuthority;
import com.sivalabs.springapp.repositories.UserRepository;
/**
* @author tony
*
*/
@Configuration
@EnableWebSecurity(debug = true)
// @EnableGlobalMethodSecurity(prePostEnabled = true)
// @ImportResource("classpath:applicationContext-security.xml")
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
JdbcTemplate jdbcTemplate ;
@Autowired
private Environment env;
@Bean
CustomUserDetailsService customUserDetailsService() {
//==================application.properties文件中配置2个SQL=============
//privilesByUsernameQuery= select authority from user_authorities where username = ?
//allUrlAuthoritiesQuery=SELECT authority_id , url FROM Url_Authorities
String privilesByUsernameQuery = env.getProperty("privilesByUsernameQuery");
String allUrlAuthoritiesQuery = env.getProperty("allUrlAuthoritiesQuery");
CustomUserDetailsService customUserDetailsService = new CustomUserDetailsService();
customUserDetailsService.setJdbcTemplate(jdbcTemplate);
customUserDetailsService.setEnableGroups(false);
//根据登录ID,查登录用户的所有权限
if(StringUtils.hasLength(privilesByUsernameQuery))
customUserDetailsService.setAuthoritiesByUsernameQuery(privilesByUsernameQuery);
//所有URL与权限的对应关系
if(StringUtils.hasLength(privilesByUsernameQuery))
customUserDetailsService.setAllUrlAuthoritiesQuery(allUrlAuthoritiesQuery);
return customUserDetailsService;
}
@Resource(name = "userRepository")
private UserRepository userRepository;
@Override
protected void configure(AuthenticationManagerBuilder registry)
throws Exception {
/*
* registry .inMemoryAuthentication() .withUser("siva") // #1
* .password("siva") .roles("USER") .and() .withUser("admin") // #2
* .password("admin") .roles("ADMIN","USER");
*/
// registry.jdbcAuthentication().dataSource(dataSource);
registry.userDetailsService(customUserDetailsService());
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/resources/**"); // #3web
}
// AntPathRequestMatcher --> AntPathRequestMatcher --->AntPathMatcher
@Override
protected void configure(HttpSecurity http) throws Exception {
//1.登录注册等URL不要身份验证
http.csrf().disable().authorizeRequests()
.antMatchers("/login", "/login/form**", "/register", "/logout")
.permitAll() // #4
.antMatchers("/admin", "/admin/**").hasRole("ADMIN"); // #6
//2. 从数据库中读取所有需要权限控制的URL资源,注意当新增URL控制时,需要重启服务
List<UrlAuthority> urlAuthorities = customUserDetailsService().loadUrlAuthorities();
for (UrlAuthority urlAuthority : urlAuthorities) {
http.authorizeRequests().antMatchers(urlAuthority.getUrl()).hasAuthority(String.valueOf(urlAuthority.getId()));
}
//3. 除1,2两个步骤验证之外的URL资源,只要身份认证即可访问
http.authorizeRequests().anyRequest().authenticated() // 7
.and().formLogin() // #8
.loginPage("/login/form") // #9
.loginProcessingUrl("/login").defaultSuccessUrl("/welcome") // #defaultSuccessUrl
.failureUrl("/login/form?error").permitAll(); // #5
}
}
1.读取数据库中的URL资源对应的权限列表
2.读取登录用户拥有的权限列表
/**
*
*/
package com.sivalabs.springapp.config;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl;
import com.sivalabs.springapp.entities.UrlAuthority;
/**
* @author tony
*
*/
public class CustomUserDetailsService extends JdbcDaoImpl{
private String allUrlAuthoritiesQuery ;
/**
* 从数据库中读取所有需要权限控制的URL资源,注意当新增URL控制时,需要重启服务
*/
public List<UrlAuthority> loadUrlAuthorities( ) {
return getJdbcTemplate().query(allUrlAuthoritiesQuery, new RowMapper<UrlAuthority>() {
public UrlAuthority mapRow(ResultSet rs, int rowNum) throws SQLException {
return new UrlAuthority (rs.getInt(1),rs.getString(2));
}
});
}
/**
* 从数据库中读取用户权限
* Loads authorities by executing the SQL from <tt>authoritiesByUsernameQuery</tt>.
* @return a list of GrantedAuthority objects for the user
*/
protected List<GrantedAuthority> loadUserAuthorities(String username) {
return getJdbcTemplate().query(super.getAuthoritiesByUsernameQuery(), new String[] {username}, new RowMapper<GrantedAuthority>() {
public GrantedAuthority mapRow(ResultSet rs, int rowNum) throws SQLException {
String roleName = rs.getString(1);
return new SimpleGrantedAuthority(roleName);
}
});
}
public void setAllUrlAuthoritiesQuery(String allUrlAuthoritiesQuery) {
this.allUrlAuthoritiesQuery = allUrlAuthoritiesQuery;
}
}
测试数据及案例见
http://note.youdao.com/share/?id=c20e348d9a08504cd3ac1c7c58d1026e&type=note
spring-security-oauth2
http://www.mvnrepository.com/artifact/org.springframework.security.oauth/spring-security-oauth2
Maven Repository: org.springframework.session » spring-session
http://www.mvnrepository.com/artifact/org.springframework.session/spring-session
分享到:
相关推荐
pring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。 Spring Security 为基于J2EE企业应用软件提供了全面安全服务。特别是使用领先的J2EE解决方案-Spring框架开发的企业软件...
在实际开发中,Spring Core 3.2.5 可以帮助我们实现以下应用场景: - 使用注解进行依赖注入,简化代码。 - 通过 AOP 实现事务管理,确保数据一致性。 - 利用 SpEL 进行动态计算和属性设置。 - 利用 IoC 容器管理...
赠送jar包:spring-security-oauth2-2.3.5.RELEASE.jar; 赠送原API文档:spring-security-oauth2-2.3.5.RELEASE-javadoc.jar; 赠送源代码:spring-security-oauth2-2.3.5.RELEASE-sources.jar; 赠送Maven依赖信息...
spring-aop-3.2.5.RELEASE.jar
标题中的"spring-cglib-repack-3.2.5.jar"和"spring-objenesis-repack-2.6.jar"是两个与Spring框架相关的库文件,它们主要用于Spring框架的内部实现,尤其是针对Java对象的创建和代理机制。下面将详细解释这两个库的...
"spring-cglib-repack-3.2.5.jar"、"spring-objenesis-repack-2.6.jar"和"spring-objenesis-repack-2.5.1.jar"这三个文件是Spring源码阅读环境中常用的依赖包,它们各自承担着不同的功能。 首先,我们来看"CGLIB"...
标题中的"spring-cglib-repack-3.2.5.jar"和"spring-objenesis-repack-2.6.jar"是Spring框架在运行时依赖的两个关键库,它们主要涉及到动态代理和对象创建的优化。 1. **CGLIB(Code Generation Library)**: ...
而`spring-cglib-repack-3.2.5.jar`和`spring-objenesis-repack-2.6.jar`这两个文件是Spring框架中两个重要的依赖包,它们分别涉及到CGlib和Objenesis两个库,这两个库在Spring中的作用不可小觑。 **CGlib(Code ...
spring-web-3.2.5.RELEASE.jar spring-web-3.2.5.RELEASE.jar
spring-jdbc-3.2.5.RELEASE.jar spring-jdbc-3.2.5.RELEASE.jar
- **Spring Transactions**:统一的事务管理,支持编程式和声明式事务。 - **Spring Test**:提供了单元测试和集成测试的支持。 6. **配置和使用** 开发者可以使用XML配置文件或者基于注解的方式配置Spring容器...
在Spring框架4.*版本中,可能会遇到一个常见问题,即缺少`spring-cglib-repack-3.2.5.jar`和`spring-objenesis-repack-2.6.jar`这两个jar文件。这两个文件是Spring框架运行时的重要依赖,它们涉及到Spring的动态代理...
2017-11-05从git_hub上拉取的Spring源码打成的jar,构建Spring-beans源码所缺失的两个jar包spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.5.1.jar
misaka-v3.2.5.ipa
Javaweb开发时服务器向客户端推送消息所需要的spring-orm-3.2.5.RELEASE.jar包,该jar包包含了一些与Javaweb开发中与SSH架构有关的封装类。
在本场景中,我们关注的是两个特定的jar包——"spring-cglib-repack-3.2.5.jar" 和 "spring-objenesis-repack-2.5.1.jar"。这些文件是Spring框架的组成部分,主要用于解决特定的依赖问题。 **1. CGLIB (Code ...
总的来说,Spring Security 3.2.5为开发人员提供了强大的安全基础,无论是在企业级应用还是小型项目中,都能提供可靠的安全保障。通过深入理解其核心组件和配置方式,开发者能够构建出健壮且安全的应用程序。
10. **安全性增强**:Spring Security是Spring的子项目,提供了认证、授权和访问控制功能,与Spring Framework紧密集成,为应用程序提供全面的安全保护。 总之,Spring Framework 3.2.5.RELEASE版本不仅继承了...
spring-cglib-repack-3.2.5.jar spring-objenesis-repack-2.6.jar spring依赖的JAR 另一个改个名字就可以的