最近公司要做开发平台,对安全要求比较高;SPRING SECURTIY框架刚好对所有安全问题都有涉及,框架的作者最近还做了spring-session项目实现分布式会话管理,还有他的另一个开源项目spring-security-oauth2。           关于spring-security的配置方法,网上有非常多的介绍,大都是基于XML配置,配置项目非常多,阅读和扩展都不方便。其实spring-security也有基于java的配置方式,今天就讲讲如何通过java配置方式,扩展spring-security实现权限配置全部从表中读取。 
    直接上代码: 
application.properties配置文件

  1. privilesByUsernameQuery= select  authority from user_authorities  where username = ?
  2. allUrlAuthoritiesQuery=SELECT authority_id , url   FROM Url_Authorities

javaconfig

  1. /**
  2. *
  3. */
  4. package com.sivalabs.springapp.config;
  5. import java.util.List;
  6. import javax.annotation.Resource;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import org.springframework.core.env.Environment;
  11. import org.springframework.jdbc.core.JdbcTemplate;
  12. import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  13. //import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
  14. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  15. import org.springframework.security.config.annotation.web.builders.WebSecurity;
  16. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  17. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  18. import org.springframework.util.StringUtils;
  19. import com.sivalabs.springapp.entities.UrlAuthority;
  20. import com.sivalabs.springapp.repositories.UserRepository;
  21. /**
  22. * @author tony
  23. *
  24. */
  25. @Configuration
  26. @EnableWebSecurity(debug = true)
  27. // @EnableGlobalMethodSecurity(prePostEnabled = true)
  28. // @ImportResource("classpath:applicationContext-security.xml")
  29. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  30. @Autowired
  31. JdbcTemplate jdbcTemplate ;
  32. @Autowired
  33. private Environment env;
  34. @Bean
  35. CustomUserDetailsService customUserDetailsService() {
  36. //==================application.properties文件中配置2个SQL=============
  37. //privilesByUsernameQuery= select  authority from user_authorities  where username = ?
  38. //allUrlAuthoritiesQuery=SELECT authority_id , url   FROM Url_Authorities
  39. String privilesByUsernameQuery = env.getProperty("privilesByUsernameQuery");
  40. String allUrlAuthoritiesQuery = env.getProperty("allUrlAuthoritiesQuery");
  41. CustomUserDetailsService customUserDetailsService = new CustomUserDetailsService();
  42. customUserDetailsService.setJdbcTemplate(jdbcTemplate);
  43. customUserDetailsService.setEnableGroups(false);
  44. //根据登录ID,查登录用户的所有权限
  45. if(StringUtils.hasLength(privilesByUsernameQuery))
  46. customUserDetailsService.setAuthoritiesByUsernameQuery(privilesByUsernameQuery);
  47. //所有URL与权限的对应关系
  48. if(StringUtils.hasLength(privilesByUsernameQuery))
  49. customUserDetailsService.setAllUrlAuthoritiesQuery(allUrlAuthoritiesQuery);
  50. return customUserDetailsService;
  51. }
  52. @Resource(name = "userRepository")
  53. private UserRepository userRepository;
  54. @Override
  55. protected void configure(AuthenticationManagerBuilder registry)
  56. throws Exception {
  57. /*
  58. * registry .inMemoryAuthentication() .withUser("siva") // #1
  59. * .password("siva") .roles("USER") .and() .withUser("admin") // #2
  60. * .password("admin") .roles("ADMIN","USER");
  61. */
  62. // registry.jdbcAuthentication().dataSource(dataSource);
  63. registry.userDetailsService(customUserDetailsService());
  64. }
  65. @Override
  66. public void configure(WebSecurity web) throws Exception {
  67. web.ignoring().antMatchers("/resources/**"); // #3web
  68. }
  69. // AntPathRequestMatcher --> AntPathRequestMatcher --->AntPathMatcher
  70. @Override
  71. protected void configure(HttpSecurity http) throws Exception {
  72. //1.登录注册等URL不要身份验证
  73. http.csrf().disable().authorizeRequests()
  74. .antMatchers("/login", "/login/form**", "/register", "/logout")
  75. .permitAll() // #4
  76. .antMatchers("/admin", "/admin/**").hasRole("ADMIN"); // #6
  77. //2. 从数据库中读取所有需要权限控制的URL资源,注意当新增URL控制时,需要重启服务
  78. List<UrlAuthority> urlAuthorities = customUserDetailsService().loadUrlAuthorities();
  79. for (UrlAuthority urlAuthority : urlAuthorities) {
  80. http.authorizeRequests().antMatchers(urlAuthority.getUrl()).hasAuthority(String.valueOf(urlAuthority.getId()));
  81. }
  82. //3. 除1,2两个步骤验证之外的URL资源,只要身份认证即可访问
  83. http.authorizeRequests().anyRequest().authenticated() // 7
  84. .and().formLogin() // #8
  85. .loginPage("/login/form") // #9
  86. .loginProcessingUrl("/login").defaultSuccessUrl("/welcome") // #defaultSuccessUrl
  87. .failureUrl("/login/form?error").permitAll(); // #5
  88. }
  89. }

1.读取数据库中的URL资源对应的权限列表  2.读取登录用户拥有的权限列表

  1. /**
  2. *
  3. */
  4. package com.sivalabs.springapp.config;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.util.List;
  8. import org.springframework.jdbc.core.RowMapper;
  9. import org.springframework.security.core.GrantedAuthority;
  10. import org.springframework.security.core.authority.SimpleGrantedAuthority;
  11. import org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl;
  12. import com.sivalabs.springapp.entities.UrlAuthority;
  13. /**
  14. * @author tony
  15. *
  16. */
  17. public class CustomUserDetailsService extends JdbcDaoImpl{
  18. private String allUrlAuthoritiesQuery ;
  19. /**
  20. * 从数据库中读取所有需要权限控制的URL资源,注意当新增URL控制时,需要重启服务
  21. */
  22. public List<UrlAuthority> loadUrlAuthorities( ) {
  23. return getJdbcTemplate().query(allUrlAuthoritiesQuery,  new RowMapper<UrlAuthority>() {
  24. public UrlAuthority mapRow(ResultSet rs, int rowNum) throws SQLException {
  25. return new UrlAuthority (rs.getInt(1),rs.getString(2));
  26. }
  27. });
  28. }
  29. /**
  30. *  从数据库中读取用户权限
  31. * Loads authorities by executing the SQL from <tt>authoritiesByUsernameQuery</tt>.
  32. * @return a list of GrantedAuthority objects for the user
  33. */
  34. protected List<GrantedAuthority> loadUserAuthorities(String username) {
  35. return getJdbcTemplate().query(super.getAuthoritiesByUsernameQuery(), new String[] {username}, new RowMapper<GrantedAuthority>() {
  36. public GrantedAuthority mapRow(ResultSet rs, int rowNum) throws SQLException {
  37. String roleName =  rs.getString(1);
  38. return new SimpleGrantedAuthority(roleName);
  39. }
  40. });
  41. }
  42. public void setAllUrlAuthoritiesQuery(String allUrlAuthoritiesQuery) {
  43. this.allUrlAuthoritiesQuery = allUrlAuthoritiesQuery;
  44. }
  45. }

测试数据及案例见  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

http://json20080301.iteye.com/blog/2190711

spring-security3.2.5实现中国式安全管理(转)的更多相关文章

  1. Spring Security3学习实例

    Spring Security是什么? Spring Security,这是一种基于Spring AOP和Servlet过滤器的安全框架.它提供全面的安全性解决方案,同时在Web请求级和方法调用级处理 ...

  2. Spring security3

    最近一直在学习spring security3,试着搭建了环境: 构建maven环境 项目配置pom.xml文件 <project xmlns="http://maven.apache ...

  3. Spring Security3实现,权限动态获取

    Spring Security3实现,权限动态获取 原文  http://blog.csdn.net/yangwei19680827/article/details/9359113 主题 网络安全Sp ...

  4. Spring Security3详细配置

    Spring Security3详细配置 表名:RESOURCE 解释:资源表备注: 资源表 RESOURCE(资源表) 是否主键 字段名 字段描述 数据类型 长度 可空 约束 缺省值 备注 是 ID ...

  5. Spring Security3 - MVC 整合教程

    下面我们将实现关于Spring Security3的一系列教程.  最终的目标是整合Spring Security + Spring3MVC  完成类似于SpringSide3中mini-web的功能 ...

  6. JavaEE学习之Spring Security3.x——模拟数据库实现用户,权限,资源的管理

    一.引言 因项目需要最近研究了下Spring Security3.x,并模拟数据库实现用户,权限,资源的管理. 二.准备 1.了解一些Spring MVC相关知识: 2.了解一些AOP相关知识: 3. ...

  7. Spring Security3十五日研究(转载)

    前言 南朝<述异记>中记载,晋王质上山砍柴,见二童子下棋,未看完,斧柄已烂,下山回村,闻同代人都去世了,自已还未变老.    因此发出“山中方一日,世上几千年” 的慨叹.原文寥寥几笔,读来 ...

  8. spring security3.1配置比较纠结的2个问题

    转自:http://www.iteye.com/topic/1122629 总论无疑问的,spring security在怎么保护网页应用安全上做得很强很周全,但有些地方还是很差强人意,比如对< ...

  9. 使用Spring Security3的四种方法概述

    使用Spring Security3的四种方法概述 那么在Spring Security3的使用中,有4种方法: 一种是全部利用配置文件,将用户.权限.资源(url)硬编码在xml文件中,已经实现过, ...

  10. Spring Security3中的-authentication-manager标签详解

    讲解完http标签的解析过程,authentication-manager标签解析部分就很容易理解了 authentication-manager标签在spring的配置文件中的定义一般如下 < ...

随机推荐

  1. 微信jssdk已无力吐槽

    微信强大的整合能力让企业公众号的开发迅速窜红.尤其是企业须要个性化定制的一些功能.公司在同一时候上线的app和触屏版的应用中,微信分享自然是不可或缺的重要一环. 纵观如今大多数的微信公众号.分享大都是 ...

  2. Expert for SQL Server 诊断系列

    Expert for SQL Server 诊断系列 Expert 诊断优化系列------------------锁是个大角色   前面几篇已经陆续从服务器的几个大块讲述了SQL SERVER数据库 ...

  3. Qt的setMouseTracking使用

    bool mouseTracking 这个属性保存的是窗口部件跟踪鼠标是否生效. 如果鼠标跟踪失效(默认),当鼠标被移动的时候只有在至少一个鼠标按键被按下时,这个窗口部件才会接收鼠标移动事件. 如果鼠 ...

  4. 三篇IMO的文章

    http://column.iresearch.cn/b/201411/687499.shtml?from=singlemessage&isappinstalled=1 http://colu ...

  5. 1.1.2-学习Opencv与MFC混合编程之---画图工具 画直线 画圆 画矩形

    源代码地址:http://download.csdn.net/detail/nuptboyzhb/3961685 画图工具 1.     画直线 Ø  增加‘直线’菜单项,建立类向导: Ø  对CXX ...

  6. 程序中非action获得spring容器

    java类: public class MySpringContext implements ApplicationContextAware{ private static ApplicationCo ...

  7. 论文阅读笔记 - YARN : Architecture of Next Generation Apache Hadoop MapReduceFramework

    作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ 更多论文阅读笔记 http:/ ...

  8. commondatastorage.googleapis.com訪问失败高速解决

    谷歌更新以后非常多sampleproject下载不了. http://commondatastorage.googleapis.com訪问失败高速解决这个问题. 使用在线代理就可以,随便推荐一个htt ...

  9. jsoncpp 不能处理long类型数据

    jsoncpp,是一个c++的解析和生成json的开源工具.假设你的c++程序须要解析或生成json,它会使这个过程变得非常easy! 可是,今天在用jsoncpp进行生成json的时候报了错误,非常 ...

  10. 多线程——实现Callable接口

    前两篇博客(多线程--继承Thread类.多线程--实现Runnable接口 )介绍了java使用线程的两种方法.这篇博客继续介绍第三种方法--实现Callable接口. 先说一下Runnable和C ...