欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Security的使用

程序员文章站 2024-03-19 14:18:40
...

Spring Security的使用

一、spring security是什么?

​ spring家族中的一款权限校验、安全框架,可以和spring无缝整合

二、为什么要是用安全框架,不使用可以吗?

​ 安全框架实际就是对过滤器做了代理增强,简化我们的拦截校验代码,同时简化我们在对RBAC的代码操作

三、什么是权限管理,如何从数据库层面出发设计权限管理?

  • 权限管理指的是,对当前用户可以进行的可执行操作的管理
  • 三表模式:直接为每一位赋予对应的权限
    • 用户名、用户权限表 、权限表
  • 五表模式:将用户分组引入角色
    • 用户表、用户角色表、角色表、角色权限表、权限表
  • 根据需求可在细分七表、九表等

三、实例演示

  • 导入依赖
<properties>
	    <spring.version>4.2.4.RELEASE</spring.version>
</properties>

 <dependencies>
     <!--spring-->
    <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-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>
     
     <!--spring security-->
    <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>
     
     <!--web-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
</dependencies>
  • 配置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>
    
     <!---security的过滤器的代理对象-->
    <filter>
       <filter-name>springSecurityFilterChain</filter-name>
       <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
        
    <!--拦击的路径-->
    <filter-mapping>
        <!--springSecurityFilterChain是固定的名称-->
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  • spring security配置文件,配置拦截规则和校验规则

    <!--开放的不用登陆成功就可以访问的资源-->
    <http pattern="资源路径" security="none"/>
    
    <!--登陆和注销的拦截业务处理 use-expression是否使用表达式写法-->
    <http use-expression="false">
        
        <!--那些资源要具有那些相应的权限 intercept-url资源路径-->
        <intercept-url pattern="/**" access="ROLE_USER" />
        
        <!-- always-use-default-target登录成功后是返回登录之前的资源,还是default-target-url-->
        <form-login login-page="/自定义的登录页面" 
                    default-target-url="/登录成功后的跳转地址"
                    always-use-default-target="true"
                    authentication-failure-url="/登录失败后的跳转地址"/>
        
        <!--关闭跨站点请求-->
        <csrf disabled="true"/>
        
        <!--注销,注销后跳转到登录页面-->
        <logout/>
        
        <!--如果页面使用了frameset或者iframe则需要添加下面的配置-->
        <headers>
    			<frame-options policy="SAMEORIGIN"/>
    	</headers>
    </http>
    
    <!-- 配置文件形式的认证管理器 -->
    <authentication-manager>
        <authentication-provider>
            <!--指定固定的权限-->
            <user-service>
                <!--权限要是用大写,如:ROLE_USER-->
                <user name="用户名" password="密码" authorities="权限"/>
            </user-service>
        </authentication-provider>
    </authentication-manager>
    
    <!-- 自定义用户信息认证管理器 实现 UserDetailService接口 -->
    <authentication-manager>
        <authentication-provider user-service-ref="userDetailService">	
        </authentication-provider>	
    </authentication-manager>
    	
    <!-- 定义自定义认证类 -->
    <beans:bean id="userDetailService" class="com.youlexuan.service.UserDetailsServiceImpl"></beans:bean>
    
  • 自定义实现用户认证管理

    /**
     *
     * @param s 当前登录的用户名
     * @return
     * @throws UsernameNotFoundException
     */
    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        //todo(根据当前登录的用户名s,查询数据库中对应用户的信息)
        return new User("用户名","密码",权限集合);
    }
    
  • security的加密

    <authentication-provider user-service-ref='userDetailService'>   
    	<!--添加加密配置-->
        <password-encoder ref="bcryptEncoder"></password-encoder>	   		
    </authentication-provider>
    
    <!--加密实现类-->
    <beans:bean id="bcryptEncoder"  
            class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
    
    //密码加密
    BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    String password = passwordEncoder.encode(seller.getPassword());
    seller.setPassword(password);
    
  • 登录成功后获取当前用户的信息

    String name=SecurityContextHolder.getContext().getAuthentication().getName();