zoukankan      html  css  js  c++  java
  • spring-security 配置简介

    1、Spring Security 简介

      Spring Security 是一个能够基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在 Spring 应用上下文中配置 Bean ,充分利用了 Spring IoC,DI 和 AOP 功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

    2、Spring Security 入门小 demo

      a、最简单 demo

        1)、创建工程 spring-security-demo ,pom.xml 内容为:

          

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>cn.itcast.demo</groupId>
        <artifactId>spring-security-demo</artifactId>
        <packaging>war</packaging>
        <version>0.0.1-SNAPSHOT</version>
        <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.7</source>
                        <target>1.7</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>
    </project>

        spring-security 框架主要依赖于 spring-security-web spring-security-config 两个包(还需依赖 spring 相关包)。

        2)、创建 web.xml

          

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        version="2.5">        
         <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> </web-app>

        spring-security 利用 spring 的过滤器代理类 org.springframework.web.filter.DelegatingFilterProxy 实现对请求的过滤,然后将请求交给 springSecurityFilterChain 这个类来具体处理请求(springSecurityFilterChain 这个类的名字是 spring-security内置的,不能改变)。该 web.xml 的配置就是 spring-security 的入口。

        3)、创建 index.xml 

        

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>首页</title>
    </head>
    <body>
    欢迎进入神奇的spring security世界~~~
    </body>
    </html>

        4)、创建 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>
    
    
    
     

        此案例没有登录页,使用了系统自动生成的登录页,效果如下:

        

        配置说明:

        http:配置页面拦截规则

        http 中的配置:

          use-expression:是否启用SPEL表达式;true为启用(默认为 true);false 为不启用;

          <intercept-url pattern=" " /> :pattern :配置要拦截的资源; /* 表示的是该目录下的资源,只包括本级目录不包括下级目录;

                                     /** 表示的是该目录以及该目录下所有级别子目录的资源

                        access:配置角色名称:要求必须以 ROLE_ 开头

          <form-login />:开启表单登录功能

          form-login 中的配置:

            login-page:指定登录页面

            authentication-failure-url:指定了身份验证失败时跳转到的页面

            default-target-url:指定了成功进行身份验证和授权后默认呈现给用户的页面

            always-use-default-target:指定了是否在身份通过验证后总是跳转到 default-target-url 指定的URL

          <logout/> :加此配置后,会自动的产生退出登录的地址 /logout,如果不想用这个地址,可以自定义生成的退出地址以及跳转的页面

          logout 中的配置:

            logout-url:退出的地址,会自动生成

            logout-success-url:退出后跳转的地址

        authentication-manager:认证管理器

        authentication-manager 中的配置:

          <authentication-provider>:认证的提供者

          <authentication-provider> 中的配置

            <user-serivce>

            <user-serivce> 中的配置:

              <user>:配置当前系统的用户

              <user> 中的配置:

                name:用户的名称(用户登录时使用的用户名

                password:用户的密码(用户登录时使用的密码

                authorities:指定当前用户对应的角色(对应access 中的角色名)

      b、自定义登录页

        实际开发中,我们不可能使用系统生成的登录页,而是使用我们自己的登录页

        1)、构建登录页

        

    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>登陆</title>
    </head>
    <body>    
        <form action='/login' method='POST'>
            <table>
                <tr>
                    <td>用户名:</td>
                    <td><input type='text' name='username' value=''></td>
                </tr>
                <tr>
                    <td>密码:</td>
                    <td><input type='password' name='password' /></td>
                </tr>
                <tr>
                    <td colspan='2'><input name="submit" type="submit"
                        value="登陆" /></td>
                </tr>
            </table>
        </form>
    </body>
    </html>

        说明:action 中的的路径 "/login" 是 spring-security 提供的路径(若想修改,可以修改配置文件中的 form-login 中 的login-processing-url 属性 ),

            登录成功会定向自己到设置的主页,登录失败会定向到设置的错误页。

            method 方式必须为 "post"。

            input 中的 name 默认是为 username 和 password ,若想修改,可以修改配置文件中的 form-login 中的 username-parameterpassword-parameter属性

        2)、构建错误页

          

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>首页</title>
    </head>
    <body>
    用户名或密码错误~~~
    </body>
    </html>

        3)、修改 spring 配置文件 spring-security.xml

        

    <!-- 以下页面不被拦截 -->
        <http pattern="/login.html" security="none"></http>
        <http pattern="/login_error.html" security="none"></http>
        <!-- 页面拦截规则 -->
        <http use-expressions="false">
            <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>

        说明:seurity = "none" 设置此资源不被拦截

           如果没有设置登录页 security = "none" ,将会出现以下错误

            

            因为登录页会反复的被重定向

            配置说明:

              csrf disable="true" 关闭 csrf ,否则会出现错误

              

              如果在系统中使用了框架页(例如:iframe),需要设置框架页的策略为 SAMEORIGIN

              

  • 相关阅读:
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 3037 Saving Beans【Lucas定理】【模板题】【模板】【组合数取余】
    8.Math 对象
  • 原文地址:https://www.cnblogs.com/elementplay/p/10857697.html
Copyright © 2011-2022 走看看