Spring security主要是从两个方面解决安全性问题:

  1. web请求级别:使用servlet过滤器保护web请求并限制URL级别的访问
  2. 方法调用级别:使用Spring AOP保护方法调用,确保具有适当权限的用户采用访问安全保护的方法.

一、引入jar包

spring-securirty主要应用到的jar包有spring-security-web.jar,spring-security-config.jar,spring-security-taglibs.jar,在maven中pom.xml配置下,
      格式:
          <dependency>
              <groupId>org.springframework.security</groupId>
              <artifactId>spring-security-web</artifactId>
              <version>4.1.2.RELEASE</version>
          </dependency>
          <dependency>
             <groupId>org.springframework.security</groupId>
             <artifactId>spring-security-config</artifactId>
             <version>4.1.2.RELEASE</version>
             </dependency>
         <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
            <version>4.1.2.RELEASE</version>
         </dependency>

二、web.xml配置

<context-param>
                        <param-name>contextConfigLocation</param-name>
                       <param-value>/WEB-INF/spring-security.xml</param-value>
          </context-param>

<listener>
                      <listener-class>org.springframework.web.context.ContextLoaderListener </listener-class>
          </listener>

<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>
这提供了一个到Spring Security Web基础结构的钩子。 DelegatingFilterProxy是一个Spring Framework类,它委托给一个过滤器实现,该过滤器实现在应用程序上下文中定义为一个Spring bean。 在这种情况下,bean名为springSecurityFilterChain,它是由命名空间创建的内部基础结构bean,用于处理Web安全。 注意,你不应该自己使用这个bean名称。 将它添加到web.xml后,就可以开始编辑应用程序上下文文件。 Web安全服务使用<http>元素配置。

三、spring-security.xml配置文件分析

      1).  要在应用程序上下文中开始使用安全命名空间,您需要在类路径上具有spring-security-config.jar。 然后你需要做的是将模式声明添加到应用程序上下文文件中:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security.xsd">...
</beans>
   在许多示例中,您将看到(在示例应用程序中),我们通常使用”security”作为默认命名空间,而不是”beans”,这意味着我们可以省略所有安全命名空间元素的前缀,使内容 更容易阅读。 如果您的应用程序上下文分为单独的文件,并且在其中一个文件中包含大部分安全配置,则可能还需要执行此操作。 然后,您的安全应用程序上下文文件将开始这样:
<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/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security.xsd">...
</beans:beans>
       <security:http auto-config="true" use-expressions="false">  <!--use-expressions 默认为true-->
            <security:intercept-url pattern="/index" access="ROLE_USER"/>
       </security:http>
 设置auto-config="true"会自动生成一个登陆界面,
  Spring security 3.0以后加入了对SpEL的支持,可以将<http>元素的use-expressions设置为"true"便可使用SpEL

Spring Security 支持的所有SpEL表达式如下:

安全表达式  计算结果
authentication   用户认证对象
denyAll   结果始终为false
hasAnyRole(list of roles)   如果用户被授权指定的任意权限,结果为true
hasRole(role) 如果用户被授予了指定的权限,结果 为true
hasIpAddress(IP Adress) 用户地址
isAnonymous()   是否为匿名用户
isAuthenticated()   不是匿名用户
isFullyAuthenticated   不是匿名也不是remember-me认证
isRemberMe()   remember-me认证
permitAll 始终true
principal 用户主要信息对象
use-expressions 默认为true,当use-expressions ='true'时; <security:intercept-url pattern="/index" access="hasRole('ROLE_USER')"/>接口access必须使用spel表达式,use-expressions ='false'时,接口不能使用spel表达式。    
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:security="http://www.springframework.org/schema/security"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
             http://www.springframework.org/schema/security  http://www.springframework.org/schema/security/spring-security-4.0.xsd">

    <security:http use-expressions="true">
        <security:form-login login-page="/open/login.html" login-processing-url="/j_spring_security_check"
                             username-parameter="username" password-parameter="password"
                             authentication-success-handler-ref="loginSuccessHandlerRef"
                             authentication-failure-url="/open/login.html" />
        <security:logout logout-url="/open/loyout" logout-success-url="/open/login.html"
        invalidate-session="true"/>
        <security:access-denied-handler error-page="/open/accessDeny.html"/>
        <security:intercept-url pattern="/resource/**" access="permitAll"/>
        <security:intercept-url pattern="/" access="permitAll" />
        <security:intercept-url pattern="/open/**" access="permitAll"/>
        <security:intercept-url pattern="/secure/**" access="fullyAuthenticated"/>
        <security:intercept-url pattern="/**" access="denyAll"/>
        <security:csrf disabled="true"/>
    </security:http>

    <bean id="loginSuccessHandlerRef" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler">
        <property name="defaultTargetUrl" value="/secure/index.html"/>
    </bean>

    <security:authentication-manager>
        <security:authentication-provider user-service-ref="testUserDetailsService">
            <security:password-encoder ref="passwordEncoder"/>
        </security:authentication-provider>
    </security:authentication-manager>

    <bean id="passwordEncoder" class="com.test.common.security.TestPasswordEncoder"></bean>

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:org/springframework/security/messages" />
    </bean>

</beans>
   

现在,配置基本完成,启动项目后,在登录页面输入用户名和密码,不管正确与否都会有405错误Request method ‘POST’ not supported。为什么会出现这个错误呢?

登录请求405错误

在登录请求中出现405错误,其实是我们在配置过程中,spring mvc和spring security出现了一点冲突导致的。

首先,请注意下面这两个配置段

<http pattern="/login" security="none"></http>
<form-login login-page="/login" login-processing-url="/login" ......

第一个配置告诉spring security,类似于/login的url请求不做过滤处理,而第二个配置信息又告诉spring security url为/login的post请求登录请求处理。正是这种冲突导致了405错误的发生。

既然知道了错误原因,那么只要避免冲突就能解决这个问题:使登录页的请求和登录处理的请求不一致,然后只配置登录页的请求不做拦截处理.

我采用的方法是使用默认的登录URL /login,修改登录页面跳转url为/loginPage。请自行修改代码和配置信息

这样是不是就大工告成了呢?很遗憾,当你启动程序时,输出用户名和密码,不管正确与否,都会有404 Not Found等着你,这又是为什么呢?

登录请求404错误

首先,建议你看一下spring security自动生成的登录页源码,你会发现有如下代码

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />

对于什么是csrf,请自行参考网上的资料。

spring security默认情况下csrf protection是开启的,由于我们的登录页没有配置csrf的相关信息,因此spring security内置的过滤器将此链接置为无效链接

解决办法就是配置csrf protection为不可用状态,在配置文件中增加

<csrf disabled="true"/>

4)异常信息本地化

<!--spring security 异常信息本地化-->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:org/springframework/security/messages"/>
</bean>

spring-security过程分析相关推荐

  1. Spring Security 中的执行原理流程分析

    1.简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spr ...

  2. spring security技术分享

    Spring Security技术专题 一.初识认证和授权 1.1 认证 1.2 会话 1.3 授权 1.4 授权的数据模型 1.5 RBAC 1.5.1 角色访问控制 1.5.2 资源访问控制 1. ...

  3. 【Spring】Spring Security介绍及其入门案例

    文章目录 前言 1. SpringSecurity 框架简介 1.1 概要 1.2 历史 1.3 同款产品对比 1.3.1 Spring Security 1.3.2 Shiro 1.4 模块划分 2 ...

  4. spring boot整合spring security笔记

    最近自己做了一个小项目,正在进行springboot和spring Security的整合,有一丢丢的感悟,在这里分享一下: 首先,spring boot整合spring security最好是使用T ...

  5. Spring Security 实战干货:自定义异常处理

    Spring Security 实战干货:自定义异常处理 转自:https://www.cnblogs.com/felordcn/p/12142514.html 文章目录 1. 前言 2. Sprin ...

  6. Spring security防止跨站请求伪造(CSRF防护)

    因为使用了spring security 安全性框架 所以spring security 会自动拦截站点所有状态变化的请求(非GET,HEAD,OPTIONS和TRACE的请求),防止跨站请求伪造(C ...

  7. 【Spring Security】五、自定义过滤器

    在之前的几篇security教程中,资源和所对应的权限都是在xml中进行配置的,也就在http标签中配置intercept-url,试想要是配置的对象不多,那还好,但是平常实际开发中都往往是非常多的资 ...

  8. SpringBoot整合Spring Security

    个人资源与分享网站:http://xiaocaoshare.com/ SpringSecurity核心功能: 认证(你是谁) 授权(你能干什么) 攻击防护(防止伪造身份) 1.pom.xml < ...

  9. spring security remember me实现自动登录

    1 默认策略 在我们自定义的login中增加一个选择框 <input type="submit" value="Login" /> <br/& ...

  10. Spring security获取当前用户

    1.如果在jsp页面中获取可以使用spring security的标签 页面引入标签 [java] view plain copyprint? <%@ taglib prefix="s ...

最新文章

  1. 视频动作识别--Towards Good Practices for Very Deep Two-Stream ConvNets
  2. Office SharePoint Server 2007 (Beta2) 管理、部署文档
  3. linux fsck exited with status code 4,linux – 在硬盘崩溃后启动PostgreSQL服务器导致FAILED STATE...
  4. 能跳过节假日的闹钟_非人哉:叫九月起床有多难?闹钟坏了许多个,哮天去叫被打了一顿...
  5. 1.10 字符串的替换(replace()、replaceFirst()和replaceAll())
  6. linux deploy 版本,Linux Deploy
  7. android初学之退出应用程序
  8. 通过单步调试的方式学习 Angular 中 TView 和 LView 的概念
  9. HashSet源码分析:JDK源码系列
  10. 长连接和Keepalive详解
  11. Scrapy_LinkExtractor
  12. Python开发入门与实战14-基于Extjs的界面
  13. ======第四章存储器管理======
  14. CLion中malloc头文件显示未找到
  15. 详解c语言欧拉函数,【基础数论】十分钟学会计算欧拉函数
  16. 安装python卡到不动了_pip卡住不动的解决方案
  17. 【有利可图网】PS实战教程31:给美女证件照片美容柔肤处理的PS技巧
  18. opc服务器不稳定的原因,OPC Client和OPC Server容易出现通讯故障,原因是什么?
  19. JAVA并发类包介绍
  20. python之红楼梦词频统计并生成图云

热门文章

  1. php重定向error,将nginx错误重定向到php
  2. spark 序列化错误 集群提交时_Spark统一内存管理机制
  3. 中如何移动物体在画面中的位置_如何在弱光环境中拍摄运动物体
  4. Bootstrap学习(二)
  5. Ubuntu / Debian / Deepin等 Sublime Text 3 配置C++环境(一键编译运行,格式化代码)
  6. 元素与集合的问题思考
  7. (一)问候 Log4j 你好
  8. signalr中Group 分组群发消息的简单使用
  9. 【思维】javascript选择排序
  10. win7如何删除mariadb