6 web权限方案
- 认证
- 授权
6.1 设置登录的用户名和密码
方式1:配置文件
spring:
datasource:
url: jdbc:mysql://xxx.xx.xx.xx:xxxx/xxxx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
security:
user:
name: admin
password: 123456
测试自定义的用户名和密码是否能成功登录
访问接口
http://localhost:8080/xxxx/xxxx/xxxx/history?shipName=%E7%99%BD%E6%B4%8B%E6%B7%80001&interval=2
成功获取数据
{"information":[],"shipName":"白洋淀001"}
方式2:配置类
不用yml配置的情况,可以写一个配置类,重写configure方法,在方法里面设置登录的用户名或者密码
/**
* security配置
*/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//对密码进行加密处理
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String password = passwordEncoder.encode("123456");
//当然,也可以加入角色
auth.inMemoryAuthentication().withUser("admin").password(password).roles("admin");
}
@Bean
PasswordEncoder password(){
return new BCryptPasswordEncoder();
}
}
测试结果同上6.1
方式3:自定义编写实现类(*********)----重点
上述两种方式都不太舒服,一般对于用户来说,都是将数据存到数据库的
因此一般来说都是实现UserDetailsService接口,自定义编写实现类。
security一般会先找配置文件或者是配置类,如果没有找到,则会去找UserDetailsService接口,找到数据库查询出的用户名和密码,进行认证
- 第一步 创建配置类,设置使用哪一个UserDetailsService的实现类
/**
* security配置
*/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 注入UserDetailsService
*/
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//指定用到哪一个UserDetailsService
auth.userDetailsService(userDetailsService).passwordEncoder(password());
}
@Bean
PasswordEncoder password(){
return new BCryptPasswordEncoder();
}
}
-
第二步 编写实现类,返回User对象,User对象有用户名密码和操作权限
@Service("userDetailsService") public class ShipUserServiceImpl implements UserDetailsService { //查询数据库的用户信息的mapper @Autowired private UserMapper userMapper; @Override public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException { String name = ""; String password = ""; //String role = ""; //查询数据库,得到用户名,密码,权限 这个User是自定义的User用户类 User user = userMapper.getUserByUserName(userName); System.out.println(user); try{ name = user.getAppId(); password = user.getAppKey(); // role = user.getRole(); }catch (Exception e){ throw new RuntimeException("查无此人"); } String role = "admin"; //用户角色 List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList(role); return new org.springframework.security.core.userdetails.User(name, new BCryptPasswordEncoder().encode(password), auths); } }
访问连接:
http://localhost:8080/xxxx/xxxx/xxxx/history?shipName=白洋淀001&interval=2
成功返回数据
访问其他接口,无需再验证,成功