Spring Security快速入门

pring Security是 Spring提供的安全认证服务的框架。 Spring Security提前封装了认证和授权的过程。它的官网:https://spring.io/projects/spring-security。

1.导入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>

2.在spring框架中整合

<filter>
    <!--
      DelegatingFilterProxy用于整合第三方框架
      整合Spring Security时过滤器的名称必须为springSecurityFilterChain,
      否则会抛出NoSuchBeanDefinitionException异常
    -->
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <!--指定需要权限校验的请求地址,通常在secyrity的配置里单独设置白名单-->
    <url-pattern>/*</url-pattern>
  </filter-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:用于定义相关权限控制
      auto-config:是否自动配置
                      设置为true时框架会提供默认的一些配置,例如提供默认的登录页面、登出处理等
                      设置为false时需要显示提供登录表单配置,否则会报错
      use-expressions:用于指定intercept-url中的access属性是否使用表达式 -->
  <security:http auto-config="true" use-expressions="true">
  <!-- http security:用于定义相关权限控制
指定哪些资源不需要进行权限校验,可以使用通配符-->
<security:http security="none" pattern="/pages/a.html" />
<security:http security="none" pattern="/paegs/b.html" />
<security:http security="none" pattern="/pages/**"></security:http>
<!-- form-login:定义表单登录信息-->
<security:form-login login-page="/login.html"
                   username-parameter="username"
                   password-parameter="password"
                   login-processing-url="/login.do"
                   default-target-url="/index.html"
                   authentication-failure-url="/login.html"
                   />
                   <!--
csrf:对应CsrfFilter过滤器
disabled:是否启用CsrfFilter过滤器,如果使用自定义登录页面需要关闭此项,否则登录操作会被禁用(403)
-->
<security:csrf disabled="true"></security:csrf>
      <!--
          intercept-url:定义一个拦截规则
          pattern:对哪些url进行权限控制
          access:在请求对应的URL时需要什么权限,默认配置时它应该是一个以逗号分隔的角色列表,
                请求的用户只需拥有其中的一个角色就能成功访问对应的URL
      -->
      <security:intercept-url pattern="/**"  access="hasRole('ROLE_ADMIN')" />
  </security:http><!--
      authentication-manager:认证管理器,用于处理认证操作
  -->
  <security:authentication-manager>
      <!--
          authentication-provider:认证提供者,执行具体的认证逻辑
      -->
      <security:authentication-provider>
          <!--
              user-service:用于获取用户信息,提供给authentication-provider进行认证
          -->
          <security:user-service>
              <!--
                  user:定义用户信息,可以指定用户名、密码、角色,后期可以改为从数据库查询用户信息
                {noop}:表示当前使用的密码为明文
              -->
              <security:user name="admin" 
                             password="{noop}admin" 
                             authorities="ROLE_ADMIN">
              </security:user>
          </security:user-service>
<!--
authentication-manager:认证管理器,用于处理认证操作
-->
<security:authentication-manager>
<!--
  authentication-provider:认证提供者,执行具体的认证逻辑
-->
<security:authentication-provider user-service-ref="userService">
</security:authentication-provider>
</security:authentication-manager><bean id="userService" class="com.itheima.security.UserService"></bean>
  
</beans>

4.设置从数据库查询信息

如果我们要从数据库动态查询用户信息,就必须按照spring security框架的要求提供一个实现UserDetailsService接口的实现类,并按照框架的要求进行配置即可。框架会自动调用实现类中的方法并自动进行密码校验。此方法需要返回一个UserDetails对象,此对象需要用户名,密码,权限。

public class UserService implements UserDetailsService{
    
    
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    
    
//此处需要返回一个 UserDetails 对象
}
}

5.设置密码加密器

在spring-security.xml文件中指定密码加密对象来对密码进行加密与解密

<!--配置密码加密对象-->
<bean id="passwordEncoder" 
    class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" /><!--认证管理器,用于处理认证操作-->
<security:authentication-manager>
<!--认证提供者,执行具体的认证逻辑-->
<security:authentication-provider user-service-ref="userService">
  <!--指定密码加密策略-->
  <security:password-encoder ref="passwordEncoder" />
</security:authentication-provider>
</security:authentication-manager>
<!--开启spring注解使用-->
<context:annotation-config></context:annotation-config>

6.通过注解控制权限

第一步:在spring-security.xml文件中配置组件扫描,用于扫描Controller

<mvc:annotation-driven></mvc:annotation-driven>
<context:component-scan base-package="com.itheima.controller"></context:component-scan>

第二步:在spring-security.xml文件中开启权限注解支持

<!--开启注解方式权限控制-->
<security:global-method-security pre-post-annotations="enabled" />

第三步:创建Controller类并在Controller的方法上加入注解进行权限控制

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;@RestController
@RequestMapping("/hello")
public class HelloController {
    
    
    @RequestMapping("/add")
    @PreAuthorize("hasAuthority('add')")//表示用户必须拥有add权限才能调用当前方法
    public String add(){
    
    
        System.out.println("add...");
        return "success";
    }@RequestMapping("/delete")
    @PreAuthorize("hasRole('ROLE_ADMIN')")//表示用户必须拥有ROLE_ADMIN角色才能调用当前方法
    public String delete(){
    
    
        System.out.println("delete...");
        return "success";
    }
}

7.退出登录

在spring-security.xml文件中进行如下配置:

<!--
  logout:退出登录
  logout-url:退出登录操作对应的请求路径
  logout-success-url:退出登录后的跳转页面
-->
<security:logout logout-url="/logout.do" 
                 logout-success-url="/login.html" invalidate-session="true"/>
       ```

猜你喜欢

转载自blog.csdn.net/coding_doge/article/details/113861180
今日推荐