Spring Security(三)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: Spring Security(三)

④. 对密码进行加密


4. 对密码进行加密


常见的密码加密方式有:
1. 3DES、AES、DES:使用对称加密算法,可以通过解密来还原出原始密码
2. MD5、SHA1:使用单向HASH算法,无法通过计算还原出原始密码,但是可以建立彩虹 表进行查表破解
3. bcrypt:将salt随机并混入最终加密后的密码,验证时也无需单独提供之前的salt,从而无需单独
处理salt问题


1.加密后的格式一般为:


微信图片_20220105213255.png


2. 实现步骤:


  • ①. 在spring-security.xml文件中指定密码加密对象


微信图片_20220105213327.png

    <!--认证管理器 -->
    <security:authentication-manager>
        <!--配置认证的提供者-->
        <security:authentication-provider user-service-ref="userService2">
            <!--指定度密码进行加密的对象-->
            <security:password-encoder ref="passwordEncoder"></security:password-encoder>
        </security:authentication-provider>
    </security:authentication-manager>
    <bean id="userService2" class="com.itheima.service.SpringSecurityUserService2"></bean>
    <!--配置密码加密对象-->
    <bean id="passwordEncoder"
          class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
    <!--开启spring注解使用-->
    <context:annotation-config></context:annotation-config>


②.修改UserService实现类


image.png


③.完整代码如下


package com.itheima.service;
import com.itheima.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SuppressWarnings("all")
public class SpringSecurityUserService2 implements UserDetailsService {
    @Autowired
    private PasswordEncoder passwordEncoder;
            //模拟数据库中的用户数据
            Map<String, User> map = new HashMap<String, User>();
    public void initUserDate(){
            User user1 = new User();
            user1.setUsername("admin");
            user1.setPassword(passwordEncoder.encode("admin"));//明文密码(没有加密)
            User user2 = new User();
            user2.setUsername("xiaoming");
            user2.setPassword(passwordEncoder.encode("1234"));
            map.put(user1.getUsername(),user1);
            map.put(user2.getUsername(),user2);
    }
    //根据用户名查询用户信息
    //UserDetails[接口]它的实现类是User
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        initUserDate();
        //System.out.println("用户输入的用户名是"+username);
        //1.根据用户名查询数据库,来获得用户信息(包括数据库中存储的密码字段)
        User user = map.get(username);//模拟根据用户名查询数据库
        if(user==null){
           //用户名不存在
           return null;
        }else {
            //用户名存在
            //2.将用户信息返回给框架
                List<GrantedAuthority>list=new ArrayList<GrantedAuthority>();
                //当前登陆用户授权,后期需要改为从数据库查询当前用户对应的实际权限
                list.add(new SimpleGrantedAuthority("ROLE_ADMIN"));//授予角色
                list.add(new SimpleGrantedAuthority("permission_A"));//授予权限
                list.add(new SimpleGrantedAuthority("permission_B"));//授予权限
                //2.1框架会进行密码比对(页面提交的密码和数据库中查询的密码进行比对)
                org.springframework.security.core.userdetails.User securityUser
                        =new org.springframework.security.core.userdetails.User(username,user.getPassword(),list);
                return securityUser;
        }
    }
}
<?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">
    <!--配置哪些资源匿名可以访问(不登录也可以访问)-->
    <!-- <security:http security="none" pattern="/pages/a.html"></security:http>
    <security:http security="none" pattern="/pages/b.html"></security:http>-->
    <security:http security="none" pattern="/pages/**"/>
    <security:http security="none" pattern="/login.html"></security:http>
    <!--
    auto-config:自动配置,如果设置为true,表示可以自动应用一些配置,比如框架会提供一个默认的登录页面
    use-expressions:是否使用spring security提供表达式来描述权限
    -->
    <security:http auto-config="true" use-expressions="true">
        <!--
        配置拦截规则,/**表示拦截所有请求
        pattern:来描述拦截规则
        access:指定所需的访问角色、访问权限
        注意:use-expressions 和 access 相匹配的
        如果use-expressions=false,则access=“‘ROLE_ADMIN’”
        -->
        <security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"></security:intercept-url>
        <!--如果我们要使用自己指定的页面作为登录页面,必须配置登录表单.页面提交的登录表单请求是由框架负责处理-->
        <!--
            login-page:指定登录页面访问URL
            default-target-url="/index.html" 登录成功了默认跳转到index.html
        -->
        <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"></security:form-login>
        <!--
          csrf:对应CsrfFilter过滤器
          disabled:是否启用CsrfFilter过滤器,如果使用自定义登录页面需要关闭此项,否则登录操作会被禁用(403)
        -->
        <security:csrf disabled="true"></security:csrf>
    </security:http>
    <!--认证管理器 -->
    <security:authentication-manager>
        <!--配置认证的提供者-->
        <security:authentication-provider user-service-ref="userService2">
            <!--指定度密码进行加密的对象-->
            <security:password-encoder ref="passwordEncoder"></security:password-encoder>
        </security:authentication-provider>
    </security:authentication-manager>
    <bean id="userService2" class="com.itheima.service.SpringSecurityUserService2"></bean>
    <!--配置密码加密对象-->
    <bean id="passwordEncoder"
          class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
    <!--开启spring注解使用-->
    <context:annotation-config></context:annotation-config>
</beans>


image.png


⑤.配置多种校验规则


5. 配置多种校验规则[掌握]


  • ①. 为了测试方便,首先在项目中创建a.html、b.html、c.html、d.html几个页面 修改spring-security.xml文件:


  • ②. 关于access


isAuthenticated:只要认证通过就可以访问
hasAutority(’add‘) : 拥有add权限就可以访问这个页面
hasRole('ROLE_ADMIN')和hasRole('ADMIN') 等价 : 拥有了ROLE_ADMIN就可以访问这个页面


image.png


⑥. 注解方式权限控制


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的方法上加入注解进行权限控制


@RestController
@RequestMapping("/hello")
public class HelloController {
    @RequestMapping("/add")//调用此方法,要求当前用户必须具备add权限
    @PreAuthorize("hasAuthority('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";
    }
}



相关文章
|
16天前
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
67 5
|
5月前
|
安全 Java 数据安全/隐私保护
使用Spring Security实现细粒度的权限控制
使用Spring Security实现细粒度的权限控制
|
5月前
|
安全 Java 数据库
实现基于Spring Security的权限管理系统
实现基于Spring Security的权限管理系统
|
5月前
|
安全 Java 数据安全/隐私保护
解析Spring Security中的权限控制策略
解析Spring Security中的权限控制策略
|
6月前
|
JSON 安全 Java
Spring Security 6.x 微信公众平台OAuth2授权实战
上一篇介绍了OAuth2协议的基本原理,以及Spring Security框架中自带的OAuth2客户端GitHub的实现细节,本篇以微信公众号网页授权登录为目的,介绍如何在原框架基础上定制开发OAuth2客户端。
228 4
Spring Security 6.x 微信公众平台OAuth2授权实战
|
6月前
|
存储 安全 Java
Spring Security 6.x OAuth2登录认证源码分析
上一篇介绍了Spring Security框架中身份认证的架构设计,本篇就OAuth2客户端登录认证的实现源码做一些分析。
259 2
Spring Security 6.x OAuth2登录认证源码分析
|
6月前
|
安全 Java 数据安全/隐私保护
Spring Security 6.x 一文快速搞懂配置原理
本文主要对整个Spring Security配置过程做一定的剖析,希望可以对学习Spring Sercurity框架的同学所有帮助。
315 5
Spring Security 6.x 一文快速搞懂配置原理
|
6月前
|
安全 Java API
Spring Security 6.x 图解身份认证的架构设计
【6月更文挑战第1天】本文主要介绍了Spring Security在身份认证方面的架构设计,以及主要业务流程,及核心代码的实现
93 1
Spring Security 6.x 图解身份认证的架构设计
|
5月前
|
安全 Java 数据安全/隐私保护
使用Spring Security实现细粒度的权限控制
使用Spring Security实现细粒度的权限控制
|
5月前
|
安全 Java 数据安全/隐私保护
使用Java和Spring Security实现身份验证与授权
使用Java和Spring Security实现身份验证与授权