Spring Security入门案例

为什么要学SpringSecurity

SpringSecurity的竞争对手是Apache的Shiro框架,并且市面上用Shir的公司要更多,但是在SpringCloud微服务中推荐用SpringSecurity框架做安全控制。

什么是SpringSecurity

SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。

SpringSecurity应用场景

Security在很多企业中作为后台角色权限框架、授权认证oauth2.0、安全防护(防止跨站点请求)、Session攻击、非常容易融合SpringMVC使用等

比如有两个账户admin和zhangsan,admin账户所有请求都有访问权限,zhangsan账户只能访问查询和添加订单权限,如果框架返回403表示权限不足,401表示没有授权

Spring Security 对应的 maven 坐标

 <dependency>
     <groupId>org.springframework.security</groupId>
     <artifactId>spring-security-web</artifactId>
     <version>5.0.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.0.5.RELEASE</version>
</dependency>

工程搭建
1 导入依赖(还需要别的spring依赖)

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>5.0.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.0.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>5.0.5.RELEASE</version>
    <scope>compile</scope>
</dependency>

2 配置web.xml

 <!--
        委派过滤器,用于整合其他框架
      DelegatingFilterProxy用于整合第三方框架
      整合Spring Security时过滤器的名称必须为springSecurityFilterChain,
      否则会抛出NoSuchBeanDefinitionException异常
    -->
    <!--名字是固定的-->
  <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>
​
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring*.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

3 创建 spring-security.xml 文件

<?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:context="http://www.springframework.org/schema/context"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc.xsd
                        http://code.alibabatech.com/schema/dubbo
                        http://code.alibabatech.com/schema/dubbo/dubbo.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context.xsd
                     http://www.springframework.org/schema/security
                     http://www.springframework.org/schema/security/spring-security.xsd">
​
​
    <!--
        http:用于定义相关权限控制
        指定哪些资源不需要进行权限校验,可以使用通配符
    -->
    <!--配置哪些资源匿名可以访问(不登录也可以访问)-->
    <security:http security="none" pattern="/js/**" />
    <security:http security="none" pattern="/css/**" />
    <security:http security="none" pattern="/login.jsp" />
​
​
    <!--
           http:用于定义相关权限控制
           auto-config:是否自动配置
                        设置为true时框架会提供默认的一些配置,例如提供默认的登录页面、登出处理等
                        设置为false时需要显示提供登录表单配置,否则会报错
           use-expressions:用于指定intercept-url中的access属性是否使用表达式
       -->
    <security:http auto-config="true" use-expressions="true">
        <!--配置拦截规则,/** 表示拦截所有请求-->
        <!--
            intercept-url:定义一个拦截规则
            pattern:对哪些url进行权限控制
            access:在请求对应的URL时需要什么权限,默认配置时它应该是一个以逗号分隔的角色列表,请求的用户只需拥有其中的一个角色就能成功访问对应的URL
            isAuthenticated():已经经过认证(不是匿名用户)
        -->
       <security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"></security:intercept-url>
    </security:http>
​
    <!--
        authentication-manager:
        认证管理器,用于处理认证操作
    -->
    <security:authentication-manager>
        <!--
            authentication-provider:认证提供者,执行具体的认证逻辑
        -->
        <security:authentication-provider>
            <security:user-service>
                <!--配置一个具体的用户,后期从数据库查询用户-->
                <security:user name="admin" password="{noop}1234" authorities="ROLE_ADMIN"/>
            </security:user-service>
        </security:authentication-provider>
    </security:authentication-manager>
​
</beans>
  

因为配置的的是 /** 拦截所有资源 所以我们可以随便访问一个页面 测试 是否被权限拦截
若拦截 会自动跳转登录页面 账号 admin 密码 1234 即可正常访问

发布了31 篇原创文章 · 获赞 8 · 访问量 1519

猜你喜欢

转载自blog.csdn.net/qq_37126480/article/details/103846428
今日推荐