一.思路

1.先导入相关配置(使用spring security校验之后,登录拦截的配置)

2.创建一个 WebSecurityConfig 继承 WebSecurityConfigurerAdapter ,重写 configure(HttpSecurity http) 配置表单登录和登出路径和跳转页面操作和 configure(AuthenticationManagerBuilder auth)进行配置用户校验

3.创建一个 UserSecurityService 类 实现 UserDetailsService 接口,重写UserDetails loadUserByUsername(String username)进行表单登录和获取权限操作

4.创建一个 UserSecurity 类实现 UserDetails 接口,重写一些需要的字段

二。代码

1. html页面

<form action="console/login.action" method="post" class="layui-form">
<input name="loginName" placeholder="账号" type="text" lay-verify="required" maxlength="15" class="layui-input">
<hr class="hr15">
<input name="loginPassword" lay-verify="required" maxlength="20" placeholder="密码" type="password"
class="layui-input">
<hr class="hr15">
<input name="loginCaptcha" lay-verify="required" maxlength="4" placeholder="验证码" type="text"
class="layui-input">
<img onclick="this.src='console/login/captcha.json" class="login_captcha" src="console/login/captcha.json">
<hr class="hr15">
<input value="登录" lay-submit lay-filter="login" style="width:100%" type="submit">
<hr class="hr20">
</form> (添加这一段,使页面提示登录报错信息)
<script th:inline="javascript" th:if="${param.error}">
    $(function () {
var tempErrorMsg = [[${SPRING_SECURITY_LAST_EXCEPTION!=null?SPRING_SECURITY_LAST_EXCEPTION.message:''}]];
layer.msg(tempErrorMsg);
});
</script>

2.WebSecurityConfig类

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { //@Autowired:自动注入bean,@Qualifier(""):限定哪个bean应该被自动注入
@Autowired
@Qualifier("UserSecurityService")
   private UserDetailsService userDetailsService;
    @Value("${app.basePath:}")
private String appBasePath; @Value("${server.port:}")
private String serverPort; @Override
protected void configure(HttpSecurity http) throws Exception { String basePath = StringUtils.trimToEmpty(appBasePath); http.authorizeRequests()
.anyRequest()
.permitAll(); http.formLogin()
.loginPage(basePath + ":" + serverPort + "/console/login.html")
.usernameParameter("loginName")
.passwordParameter("loginPassword")
.loginProcessingUrl("/console/login.action")
.defaultSuccessUrl(basePath + ":" + serverPort + "/console/index.html", true)
.failureForwardUrl("/console/login.html?error=true")
.permitAll(); http.logout()
.logoutUrl("/console/logout.action")
.logoutSuccessUrl(basePath + ":" + serverPort + "/console/login.html")
.permitAll(); //关闭CSRF跨域
http.csrf()
.disable(); http.headers()
.frameOptions()
.disable();
} @Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(this.userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
}
} 3.SecurityUserinfoService
@Component("UserSecurityService")
public class UserSecurityService implements UserDetailsService {
    @Autowired
private AdminService adminService; public static final String CAPTCHA_PARAMETER_NAME = "loginCaptcha"; @Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { HttpServletRequest currentServletRequest = RequestTool.getCurrentServletRequest();
boolean b = CaptchaTool.checkCaptcha(currentServletRequest, CAPTCHA_PARAMETER_NAME);
if (b == false) {
throw new SecurityCaptchaException("图形验证码错误");
} UserSecurity userinfo = null;
Admin admin = this.adminService.getByUserName(username);
if (admin != null) {
userinfo = new SecurityUserinfo();
userinfo.setUsername(admin.getAccount());
userinfo.setPassword(admin.getPassword());
userinfo.setEnabled(admin.getIsEnabled());
userinfo.setUserId(admin.getId());
userinfo.setAuthorities(****);//自定义设置权限
} else {
throw new UsernameNotFoundException("用户不存在");
}
return userinfo;
}
}
4.UserSecurity 
@Setter
public class UserSecurity implements UserDetails {
    private String username;
   private String password;
   private boolean accountNonExpired = true;
private boolean accountNonLocked = true;
private boolean credentialsNonExpired = true;
private boolean enabled;
  private Set<***> authorities;//权限字段,需要自己去定义
  @Override
  public Collection<? extends GrantedAuthority> getAuthorities() {
   return this.authorities;
  }
  @Getter
  private String userId;
  
  @Override
  public String getPassword() {
     return this.password;
  }

  @Override
  public String getUsername() {
  return this.username;
  }   @Override
  public boolean isAccountNonExpired() {
 return this.accountNonExpired;
  }   @Override
  public boolean isAccountNonLocked() {
   return this.accountNonLocked;
  }   @Override
  public boolean isCredentialsNonExpired() {
   return this.credentialsNonExpired;
  }   @Override
  public boolean isEnabled() {  
  return this.enabled;
  }
}
注意:如果登录失败的话会出现 Bad credentials 的提示,还要添加 messages.properties 放到 resources 目录下
AbstractUserDetailsAuthenticationProvider.badCredentials=用户名或密码错误
AbstractUserDetailsAuthenticationProvider.credentialsExpired=用户凭证已过期
AbstractUserDetailsAuthenticationProvider.disabled=用户已失效
AbstractUserDetailsAuthenticationProvider.expired=用户帐号已过期
AbstractUserDetailsAuthenticationProvider.locked=用户帐号已被锁定 参考文档:
https://blog.csdn.net/java_zhaoyu/article/details/83029672
https://www.cnblogs.com/ryelqy/p/10304619.html
https://www.codeleading.com/article/5677789104/


spring security简单登录的认证的更多相关文章

  1. Spring Security 自定义登录认证(二)

    一.前言 本篇文章将讲述Spring Security自定义登录认证校验用户名.密码,自定义密码加密方式,以及在前后端分离的情况下认证失败或成功处理返回json格式数据 温馨小提示:Spring Se ...

  2. 玩转spring boot——简单登录认证

    前言 在一个web项目中,某些页面是可以匿名访问的,但有些页面则不能.spring mvc提供了HandlerInterceptor接口来应对,只需要重写preHandle方法便可以实现此功能.那么使 ...

  3. spring security 简单入门

    spring security 简单入门示例 一.概述 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架 . 其中最主要的安全操作有两 ...

  4. Spring Security 解析(三) —— 个性化认证 以及 RememberMe 实现

    Spring Security 解析(三) -- 个性化认证 以及 RememberMe 实现   在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把 ...

  5. Spring Security 之Http Basic认证

    使用Spring Security进行http Basic认证非常简单,直接配置即可使用,如下: <security:http> <security:http-basic>&l ...

  6. 登陆模块,这个是很重要的模块,有shiro和spring security专门的权限认证框架

    登陆模块,这个是很重要的模块,有shiro和spring security专门的权限认证框架

  7. 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_05-SpringSecurityOauth2研究-搭建认证服务器

    3 Spring Security Oauth2研究 3.1 目标 本项目认证服务基于Spring Security Oauth2进行构建,并在其基础上作了一些扩展,采用JWT令牌机制,并自定 义了用 ...

  8. Spring Security 基础登录实例

    1 新建Java Web项目 导入Jar: 2 修改web.xml <?xml version="1.0" encoding="UTF-8"?> & ...

  9. 【权限管理系统】Spring security(三)---认证过程(原理解析,demo)

      在前面两节Spring security (一)架构框架-Component.Service.Filter分析和Spring Security(二)--WebSecurityConfigurer配 ...

随机推荐

  1. fastjson对String、JSONObject、JSONArray相互转换

    String——>>>JSONArray String st = "[{name:Tim,age:25,sex:male},{name:Tom,age:28,sex:mal ...

  2. animation 动画 与 transition

    animation: name duration timing-function delay iteration-count direction; 值 描述 animation-name 规定需要绑定 ...

  3. 如何从二进制文件中读取int型序列

    使用的主要函数是int.from_bytes 代码如下: f = open('./T26.dat', 'rb') for i in range(20): A = f.read(2) A = int.f ...

  4. 记一次Idea+Gradle编译Spring源码遇到的坑

    打算开始研究Spring源码,于是照着书上的指导从网上下载了Spring5.0.2版本和Gradle4.0(必须JDK1.8.60以上),本地编译的时候没有任何问题,就是导入Idea的时候一直报下面这 ...

  5. Python在Linux下编译安装

    [准备环境] Linux centos [前言] 1 linux下默认带Python,带的是2.7版本的 ,如果需要升级版本,需要把系统的自带的Python改名或者卸载,再次安装你所需要的Python ...

  6. WeChair项目Beta冲刺(7/10)

    团队项目进行情况 1.昨日进展    Beta冲刺第七天 昨日进展: 前后端并行开发,项目按照计划有条不絮进行 2.今日安排 前端:扫码占座功能和预约功能并行开发 后端:扫码占座后端逻辑开发,编码预约 ...

  7. Linux下重新设置 MySQL 的密码

    1.重置密码的第一步就是跳过MySQL的密码认证过程,方法如下: #vim /etc/my.cnf(注:windows下修改的是my.ini) 很多老铁,在开始时设置了 MySQL 的密码,后来一段时 ...

  8. redis编译报错总结

    redis编译报错总结: 1.不能编译没有GCC 编译工具安装报错:问题1:make时可能会报如下错误cc -c -std=c99 -pedantic -O2 -Wall -W   -g -rdyna ...

  9. npm: no such file or directory, scandir '.../node_modules/node-sass/vendor'

    运行vue报错 npm run dev 解决办法,运行:npm rebuild node-sass

  10. python多线程+生产者和消费者模型+queue使用

    多线程简介 多线程:在一个进程内部,要同时干很多事情,就需要同时执行多个子任务,我们把进程内的这些子任务叫线程. 线程的内存空间是共享的,每个线程都共享同一个进程的资源 模块: 1._thread模块 ...