展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

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跳转到首页

案例三

  • security + jwt
  • 02-jt-spring-security
  • 案例地址
  • 链接
  • 启动项目
  • 直接发送请求
# 返回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,有权限则操作成功,没有权限则返回无权限,例如我们想在另一个新的模块中判断用户是否具有权限

posted @ 2021-12-22 09:30  DogLeftover  阅读(23)  评论(0编辑  收藏  举报