前言
作为本月最后一篇文章, 想写点Web技术相关的, 浏览了本月的博客发现居然全是数据结构与算法的文章🤪,说实话我是有点写吐了的. 十二月的话 , 计划是不会用新文章了(不过可能会更新数据结构和JavaSE的思维导图) . 毕竟考试月到了嘛,学校的课程除了数据结构几乎没怎么学过其它的.
行了行了,话不多说, 我们进入正题
提示:以下是本篇文章正文内容,下面案例可供参考
一、使用配置文件定义用户名密码
丑话说在前头, 用户名密码对于Web应用程序来说, 不应该是写死的东西. 所以用配置文件定义的话 , 是非常鸡肋的.
代码
我这里用的是properties
的代码, 转为yml
道理也一样
#通过配置文件配置用户名密码
spring.security.user.name= admin
spring.security.user.password=123
二、使用配置类
我们直接给代码,因为下面第三点用到的配置类功能更加强大, 这种方式的自定义并不常用
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("").password("").roles("");
}
三、使用配置文件加实现类的方式
这种是比较常用且实用的方式,写起来也更加灵活
大体思路可以分成两步 ,创建配置类并对实现类进行一定的配置(主要是编码方式), 创建实现类查询出用户名密码并注入到框架提供的User对象之中
代码实现
1.配置类
我们首先需要去继承WebSecurityConfigurerAdapter
类,同时向Spring注入UserDetailsService
对象,并对父类的configure(AuthenticationManagerBuilder auth)
方法进行重载
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter { //1.继承WebSecurityConfigurerAdapter类
//2.注入userDetailsService对象
@Autowired
private UserDetailsService userDetailsService;//
//3.重写configure对象
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(password());
}
//4.设置密码编码方式
@Bean
PasswordEncoder password(){
return new BCryptPasswordEncoder();
}
}
2.实现类
这里需要注意得是,对于@Service
中的参数 ,必须与前面配置类中注入的UserDetailsService
对象完全一致
@Service("userDetailsService") //1.将用户信息服务类标记为userDetailService
public class MyUserServiceDetailService implements UserDetailsService { //2.实现UserDetailsService接口
@Autowired
AdminDao adminDao;
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
//3.从数据库中查找用户的账号密码及权限信息
List<Admin> adminInfo = adminDao.getAdminInfo();
Integer adminPwd = adminInfo.get(0).getAdminPwd();
String adminId = adminInfo.get(0).getAdminId();
List<GrantedAuthority> auth = AuthorityUtils.commaSeparatedStringToAuthorityList("admin");
//4.注入
return new User(adminId , new BCryptPasswordEncoder().encode(adminPwd.toString()),auth);
}
}