SpringSecurity的配置相对来说有些复杂,如果是完整的bean配置,则需要配置大量的bean,所以xml配置时使用了命名空间来简化配置,同样,spring为我们提供了一个抽象类WebSecurityConfigurerAdapter和一个注解@EnableWebMvcSecurity,达到同样减少bean配置的目的,如下:

applicationContext-SpringSecurityConfig.xml

  1. <http security="none" pattern="/static/**" />
  2. <http security="none" pattern="/**/*.jsp" />
  3. <http auto-config='true' access-decision-manager-ref="accessDecisionManager" access-denied-page="/login"
  4. use-expressions="true">
  5. <logout logout-url="/logout" invalidate-session="true"
  6. logout-success-url="/login" />
  7. <form-login login-page="/login" authentication-failure-url="/login?error=1"
  8. login-processing-url="/j_spring_security_check" password-parameter="j_password"
  9. username-parameter="j_username" />
  10. <intercept-url pattern="/**/*.do*" access="hasRole('ROLE_USER')" />
  11. <intercept-url pattern="/**/*.htm" access="hasRole('ROLE_ADMIN')" />
  12. <session-management session-fixation-protection="changeSessionId">
  13. <concurrency-control max-sessions="1"
  14. expired-url="/access/sameLogin.do" />
  15. </session-management>
  16. <remember-me key="webmvc#FD637E6D9C0F1A5A67082AF56CE32485"
  17. remember-me-parameter="remember-me" />
  18. </http>
  19. <!-- 启用表达式 为了后面的投票器做准备 -->
  20. <beans:bean
  21. class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler"
  22. id="expressionHandler" />
  23. <beans:bean
  24. class="org.springframework.security.web.access.expression.WebExpressionVoter"
  25. id="expressionVoter">
  26. <beans:property name="expressionHandler" ref="expressionHandler" />
  27. </beans:bean>
  28. <!-- Automatically receives AuthenticationEvent messages -->
  29. <beans:bean id="loggerListener"
  30. class="org.springframework.security.authentication.event.LoggerListener" />
  31. <beans:bean id="authorizationListener"
  32. class="org.springframework.security.access.event.LoggerListener" />
  33. <!-- 认证管理器,使用自定义的UserDetailsService,并对密码采用md5加密 -->
  34. <authentication-manager>
  35. <authentication-provider user-service-ref="userService">
  36. <password-encoder hash="md5" />
  37. </authentication-provider>
  38. </authentication-manager>
  39. <beans:bean id="userService" class="web.security.CP_UserDetailsService" />
  40. <beans:bean id="accessDecisionManager"
  41. class="org.springframework.security.access.vote.AffirmativeBased">
  42. <beans:property name="decisionVoters">
  43. <beans:list>
  44. <beans:bean class="org.springframework.security.access.vote.RoleVoter" />
  45. <beans:bean
  46. class="org.springframework.security.access.vote.AuthenticatedVoter" />
  47. <beans:ref bean="expressionVoter" />
  48. </beans:list>
  49. </beans:property>
  50. </beans:bean>

SpringSecurityConfig.java

  1. @Configuration
  2. @EnableWebMvcSecurity
  3. public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
  4. private static final Logger logger = Logger
  5. .getLogger(SpringSecurityConfig.class);
  6. @Override
  7. public void configure(WebSecurity web) throws Exception {
  8. // 设置不拦截规则
  9. web.ignoring().antMatchers("/static/**", "/**/*.jsp");
  10. }
  11. @Override
  12. protected void configure(HttpSecurity http) throws Exception {
  13. // 设置拦截规则
  14. // 自定义accessDecisionManager访问控制器,并开启表达式语言
  15. http.authorizeRequests().accessDecisionManager(accessDecisionManager())
  16. .expressionHandler(webSecurityExpressionHandler())
  17. .antMatchers("/**/*.do*").hasRole("USER")
  18. .antMatchers("/**/*.htm").hasRole("ADMIN").and()
  19. .exceptionHandling().accessDeniedPage("/login");
  20. // 开启默认登录页面
  21. // http.formLogin();
  22. // 自定义登录页面
  23. http.csrf().disable().formLogin().loginPage("/login")
  24. .failureUrl("/login?error=1")
  25. .loginProcessingUrl("/j_spring_security_check")
  26. .usernameParameter("j_username")
  27. .passwordParameter("j_password").permitAll();
  28. // 自定义注销
  29. http.logout().logoutUrl("/logout").logoutSuccessUrl("/login")
  30. .invalidateHttpSession(true);
  31. // session管理
  32. http.sessionManagement().sessionFixation().changeSessionId()
  33. .maximumSessions(1).expiredUrl("/");
  34. // RemeberMe
  35. http.rememberMe().key("webmvc#FD637E6D9C0F1A5A67082AF56CE32485");
  36. }
  37. @Override
  38. protected void configure(AuthenticationManagerBuilder auth)
  39. throws Exception {
  40. // 自定义UserDetailsService
  41. auth.userDetailsService(userDetailsService()).passwordEncoder(
  42. new Md5PasswordEncoder());
  43. }
  44. @Bean
  45. public CP_UserDetailsService userDetailsService() {
  46. logger.info("CP_UserDetailsService");
  47. CP_UserDetailsService userDetailsService = new CP_UserDetailsService();
  48. return userDetailsService;
  49. }
  50. @Bean
  51. public LoggerListener loggerListener() {
  52. logger.info("org.springframework.security.authentication.event.LoggerListener");
  53. LoggerListener loggerListener = new LoggerListener();
  54. return loggerListener;
  55. }
  56. @Bean
  57. public org.springframework.security.access.event.LoggerListener eventLoggerListener() {
  58. logger.info("org.springframework.security.access.event.LoggerListener");
  59. org.springframework.security.access.event.LoggerListener eventLoggerListener = new org.springframework.security.access.event.LoggerListener();
  60. return eventLoggerListener;
  61. }
  62. /*
  63. *
  64. * 这里可以增加自定义的投票器
  65. */
  66. @SuppressWarnings("rawtypes")
  67. @Bean(name = "accessDecisionManager")
  68. public AccessDecisionManager accessDecisionManager() {
  69. logger.info("AccessDecisionManager");
  70. List<AccessDecisionVoter> decisionVoters = new ArrayList<AccessDecisionVoter>();
  71. decisionVoters.add(new RoleVoter());
  72. decisionVoters.add(new AuthenticatedVoter());
  73. decisionVoters.add(webExpressionVoter());// 启用表达式投票器
  74. AffirmativeBased accessDecisionManager = new AffirmativeBased(
  75. decisionVoters);
  76. return accessDecisionManager;
  77. }
  78. /*
  79. * 表达式控制器
  80. */
  81. @Bean(name = "expressionHandler")
  82. public DefaultWebSecurityExpressionHandler webSecurityExpressionHandler() {
  83. logger.info("DefaultWebSecurityExpressionHandler");
  84. DefaultWebSecurityExpressionHandler webSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
  85. return webSecurityExpressionHandler;
  86. }
  87. /*
  88. * 表达式投票器
  89. */
  90. @Bean(name = "expressionVoter")
  91. public WebExpressionVoter webExpressionVoter() {
  92. logger.info("WebExpressionVoter");
  93. WebExpressionVoter webExpressionVoter = new WebExpressionVoter();
  94. webExpressionVoter.setExpressionHandler(webSecurityExpressionHandler());
  95. return webExpressionVoter;
  96. }
  97. }

SpringSecurity相关配置【SpringSecurityConfig】的更多相关文章

  1. zookeeper集群的搭建以及hadoop ha的相关配置

    1.环境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 master作为active主机,data1作为standby备用机,三台机器均作为数据节点,yarn资源 ...

  2. Linux网络相关配置

    一.修改网卡相关配置 Linux网络参数是在/etc/sysconfig/network-scripts/ifcfg-eth0中设置,其中ifcfg-eth0表示是第一个网卡,如果还有另外一块网卡,则 ...

  3. ios开发之Info.plist文件相关配置

    前言:在iOS开发中有些情况下需要对Info.plist文件进行配置,以下介绍几种相关配置.以后遇到需要配置的再更新... 开发环境:swift3.0.1,Xcode8.1 一,项目中需要使用第三方字 ...

  4. SharePoint 2013 托管导航及相关配置 <二>

    本文的思路是使用JQuery重写SharePoint自带托管导航的样式,其实思路和脚本都非常简单,引用一下JQuery脚本,然后重写导航的样式,把脚本放到母版页中,即可.当然,使用JQuery可以做很 ...

  5. IO 相关配置参数

    INNODB I/O相关配置 记录日志为顺序I/O,刷新日志到数据文件为随机操作.顺序操作性能快于随机IO. innodb_log_file_size innodb_log_files_in_grou ...

  6. win7下IIS错误:"无法访问请求的页面,因为该页的相关配置数据无效"的解决方法(转)

    今天新装win7,然后在IIS下布署了一个网站,布署完成后运行,提示如下错误:HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该页的相关配置数据无效 ...

  7. IDEA 从SVN检出项目相关配置

    1.新建好一个工程,然后通过SVN检出项目 2.检出后一般tomcat的环境是配置好的,点击上方Project Structure按钮,弹出窗体,查看Project项,一般没问题,如果要配置就配置Pr ...

  8. HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效。

    HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息模块 IIS Web Core 通知 BeginReques ...

  9. "HTTP 错误 500.19 请求的页面的相关配置数据无效" 解决办法

    HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该页的相关配置数据无效. 问题"详细错误信息模块 IIS Web Core通知 Begin ...

随机推荐

  1. 初步比较zeromq vs. wcf

    用最简单的Calculator比较zeromq的req-rep模式 vs. wcf的http和net.tcp模式,看哪一种的传输性能更高. 1.比较结果如下 方式 耗费时间 wcf_http_sing ...

  2. TClientDataSet 设计期 多次New 字段问题

    第一次New几个字段后,右键菜单CreateDataSet 后来需要再New几个字段. 右键菜单,先 ClearData(不这样,会报 打开的数据集不能执行 这个New字段的操作),然后在 字段编辑器 ...

  3. C++-new操作符

    1,new操作符实际上包含三部分:operator new分配内存和调用构造函数初始化刚刚分配的内存,类型转换刚刚的指针. string* ps = new string("lalalala ...

  4. spark1.3.1安装和集群的搭建

    由于越来越多的人开始使用spark计算框架了,而且spark计算框架也是可以运行在yarn的平台上,因此可以利用单个集群,运行多个计算框架.这是一些大公司都是这么干的.好了,下面讲一下spark1.3 ...

  5. (转)xcode5.0.2下国际化图文解说

    原文:http://blog.csdn.net/dragoncheng/article/details/6703311 xcode5.0.2下国际化图文解说         分类:           ...

  6. S50非接触式IC卡性能简介(M1)

    一.主要指标 分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位: 每个扇区有独立的一组密码及访问控制: 每张卡有唯一序列号,为32位: 具有防冲突机制,支持多卡操作: 无电源,自带天线, ...

  7. 怎么用sql语句查看某个字段值是否是唯一的

    select count(*) from table group by zd having count(*)>1 这是不唯一的过滤出来的语句

  8. android中KSOAP2中的anytype{}问题

    如果web返回为空,即空字符串的时候,KSOAP2会返回一个anytype{}这样的一个串回来,要比对下是不是这个串,如果是就返回null,从而避免查不到数据时没有相应处理. if (jsonStr. ...

  9. Activity与Service通信(不同进程之间)

    使用Messenger 上面的方法只能在同一个进程里才能用,如果要与另外一个进程的Service进行通信,则可以用Messenger. 其实实现IPC(Inter-Process Communicat ...

  10. 配置PhoneGap 到iOS

    下载 phonegap安装phonegap之前需要NodeJS环境,下载NodeJS并安装.安装环境的目的是为了使用phonegap命令行. 3. 安装phonegap使用命令    $phonega ...