④. 对密码进行加密
4.
对密码进行加密
常见的密码加密方式有: 1. 3DES、AES、DES:使用对称加密算法,可以通过解密来还原出原始密码 2. MD5、SHA1:使用单向HASH算法,无法通过计算还原出原始密码,但是可以建立彩虹 表进行查表破解 3. bcrypt:将salt随机并混入最终加密后的密码,验证时也无需单独提供之前的salt,从而无需单独 处理salt问题
1.加密后的格式一般为:
2.
实现步骤:
- ①. 在spring-security.xml文件中指定密码加密对象
<!--认证管理器 --> <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实现类
③.完整代码如下
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>
⑤.配置多种校验规则
5.
配置多种校验规则[掌握]
- ①. 为了测试方便,首先在项目中创建a.html、b.html、c.html、d.html几个页面 修改spring-security.xml文件:
- ②. 关于access
isAuthenticated:只要认证通过就可以访问 hasAutority(’add‘) : 拥有add权限就可以访问这个页面 hasRole('ROLE_ADMIN')和hasRole('ADMIN') 等价 : 拥有了ROLE_ADMIN就可以访问这个页面
⑥. 注解方式权限控制
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"; } }