Spring Security

Posted miantiao312

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Security相关的知识,希望对你有一定的参考价值。

介绍

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。 
它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion 
of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明 
式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

入门案例

1、创建Maven工程(war)

    A、POM.XML文件:
            <properties>
                <spring.version>4.2.4.RELEASE</spring.version>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-core</artifactId>
                    <version>${spring.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-web</artifactId>
                    <version>${spring.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-webmvc</artifactId>
                    <version>${spring.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context-support</artifactId>
                    <version>${spring.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-test</artifactId>
                    <version>${spring.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-jdbc</artifactId>
                    <version>${spring.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework.security</groupId>
                    <artifactId>spring-security-web</artifactId>
                    <version>4.1.0.RELEASE</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework.security</groupId>
                    <artifactId>spring-security-config</artifactId>
                    <version>4.1.0.RELEASE</version>
                </dependency>
                <dependency>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                    <version>2.5</version>
                    <scope>provided</scope>
                </dependency>
            </dependencies>
            <build>
              <plugins>     
                  <!-- java编译插件 -->
                  <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>3.2</version>
                        <configuration>
                            <source>1.8</source>
                            <target>1.8</target>
                            <encoding>UTF-8</encoding>
                        </configuration>
                  </plugin>      
                  <plugin>
                        <groupId>org.apache.tomcat.maven</groupId>
                        <artifactId>tomcat7-maven-plugin</artifactId>
                        <configuration>
                            <!-- 指定端口 -->
                            <port>9090</port>
                            <!-- 请求路径 -->
                            <path>/</path>
                        </configuration>
                  </plugin>
               </plugins>  
            </build>
    
    B、创建web.xml
            <context-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath: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>

    C、创建index.html(输出一句话---------->内容随意)

    D、创建spring 配置文件spring-security.xml
        <?xml version="1.0" encoding="UTF-8"?>
        <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.xsd
                                http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">
            <!-- 页面拦截规则 -->
            <http use-expressions="false">
                <intercept-url pattern="/**" access="ROLE_USER" />
                <form-login/>   
            </http>
        
            <!-- 认证管理器 -->
            <authentication-manager>
                <authentication-provider>
                    <user-service>
                        <user name="admin" password="123456" authorities="ROLE_USER"/>
                    </user-service>     
                </authentication-provider>  
            </authentication-manager>   
        </beans:beans>
    
此案例我们没有登录页,而是使用了系统自动生成的登陆页,效果如下图示:

技术分享图片

配置说明:

    intercept-url 表示拦截页面   
    /*  表示的是该目录下的资源,只包括本级目录不包括下级目录
    /** 表示的是该目录以及该目录下所有级别子目录的资源
    form-login  为开启表单登陆
    use-expressions 为是否使用使用 Spring 表达式语言( SpEL ),默认为true ,如果开启,则拦截的配置应该写成以下形式
            <intercept-url pattern="/**" access="hasRole(‘ROLE_USER‘)" />
此时启动项目访问 localhost:9090;会自动跳转到上图所示的登陆页面(默认的页面),即可登陆验证

2、在刚才的基础项目上修改入门案例

 A、用户自定义登录页
        <!DOCTYPE html>
        <html>
        <head>
        <meta charset="UTF-8">
        <title>登陆</title>
        </head>
            <body>
                --欢迎的登陆我的系统--
                <form action="/login" method="post">
                    用户名:<input name="username"><br>
                    密码:<input name="password"><br>
                    <button>登陆</button>
                </form>
            </body>
        </html>

B、创建login_error.html(输出一句话---------->内容随意)

C、修改 spring 配置文件spring-security.xml(注释掉刚才写法)

        <!-- 设置页面不登陆也可以访问  -->
        <http pattern="/login.html" security="none"></http>
        <http pattern="/login_error.html" security="none"></http>
    
        <!-- 页面的拦截规则    use-expressions:是否启动SPEL表达式 默认是true -->
        <http use-expressions="false">
            <!-- 当前用户必须有ROLE_USER的角色 才可以访问根目录及所属子目录的资源 -->
            <intercept-url pattern="/**" access="ROLE_USER"/>
            <!-- 开启表单登陆功能 -->
            <form-login   login-page="/login.html" default-target-url="/index.html" authentication-failure-url="/login_error.html"/>
            <csrf disabled="true"/>
        </http>
        
        <!-- 认证管理器 -->
        <authentication-manager>
            <authentication-provider>
                <user-service>
                    <user name="admin" password="123456" authorities="ROLE_USER"/>
                </user-service>
            </authentication-provider>  
        </authentication-manager>
security="none" 设置此资源不被拦截.
如果你没有设置登录页security="none" ,将会出现以下错误(原因:因为登录页会被反复重定向)

技术分享图片

login-page:指定登录页面。
authentication-failure-url:指定了身份验证失败时跳转到的页面。
default-target-url:指定了成功进行身份验证和授权后默认呈现给用户的页面。
csrf disabled="true"  关闭csrf ,如果不加会出现错误
    CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”
    或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。

技术分享图片

以上是关于Spring Security的主要内容,如果未能解决你的问题,请参考以下文章

oauth2 spring-security 如果您在请求令牌或代码之前登录

Spring Security问题

Spring Security:如何获取自动渲染的登录页面代码?

spring security 匿名访问安全吗

springboot集成spring security实现restful风格的登录认证 附代码

未调用 Spring Security j_spring_security_check