security案例总结
案例一
- 案例地址
核心代码
// 配置类
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
//注入数据源
@Autowired
private DataSource dataSource;
//配置对象
@Bean
public PersistentTokenRepository persistentTokenRepository() {
JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
jdbcTokenRepository.setDataSource(dataSource);
return jdbcTokenRepository;
}
@Bean
PasswordEncoder password() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// 退出登录
http.logout().logoutUrl("/logout").logoutSuccessUrl("/test/hello").permitAll();
// 没有访问权限时跳转的自定义页面
http.exceptionHandling().accessDeniedPage("/unauth.html");
// 自定义认证页面
http.formLogin().loginPage("/login.html")
// 登录的url
.loginProcessingUrl("/login")
// 登录成功后跳转的页面
.defaultSuccessUrl("/success.html")
// 登录失败的跳转页面
.failureUrl("/fail.html");
// 指定url不需要认证
http.authorizeRequests().antMatchers("/login.html").permitAll()
// 其他url需要认证
.anyRequest().authenticated()
.and().rememberMe().tokenRepository(persistentTokenRepository())
// 设置有效时长,单位秒
.tokenValiditySeconds(60)
.userDetailsService(userDetailsService);
// 关闭csrf防护
//http.csrf().disable();
}
}
// 业务类
@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {
@Autowired
private UsersMapper usersMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//调用usersMapper方法,根据用户名查询数据库
QueryWrapper<Users> wrapper = new QueryWrapper();
wrapper.eq("username",username);
Users users = usersMapper.selectOne(wrapper);
// 数据库没有用户名,认证失败
if(users == null) {
throw new UsernameNotFoundException("用户不存在!");
}
List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("admin");
// 返回User对象
return new User(users.getUsername(), new BCryptPasswordEncoder().encode(users.getPassword()),auths);
}
}
-
以上代码实现的功能:从数据库中查询用户名和密码与前端页面输入的用户名和密码进行比较
-
若要实现自动登录并设置token有效时间则需新建表
-
补充:前后端分离项目中路由跳转,在配置类中设置url,在控制层中编写接口返回指定的数据
案例二
-
02-jt-spring-security
-
当前项目没有从MySQL查询用户名和密码,在UserDetailServiceImpl中设置的假数据
-
启动项目访问http://localhost:8080/login.html,输入jack:123,返回json
-
再访问http://localhost:8080/index跳转到首页
案例三
# 返回token
{"Authentication":"eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NDAxNDYzNzksImlhdCI6MTY0MDE0NDU3OSwidXNlcm5hbWUiOiJqYWNrIn0.HjqmFXtNcvJTo-dGJCUX_i6cAn-mp8hsP0xjGi3MUok","state":"200","message":"login ok"}
-
测试是否登录成功,需在请求头中带上token
-
配置类中添加接口url,那么访问该url需在请求头中带上token
@Configuration
public class SpringWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TokenInterceptor())
.addPathPatterns("/retrieve","/update");
}
}
案例四
-
发送post登录请求时报错:
java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverte
-
04-jt-sso
链接 -
单点登录:cloud + security + jwt
-
启动项目后访问http://localhost:80/login.html进入登录页面
-
输入用户名和密码(jack:123)到sso-auth模块中认证
-
认证成功后查询该用户拥有的
权限
,返回给前端token,同时跳转到index.html
-
点击超链接时发送请求并带上token,有权限则操作成功,没有权限则返回无权限,例如我们想在另一个新的模块中判断用户是否具有权限