一.思路

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. JS之预解释原理

    预解释的原理 预解释的不同机制 var的预解释机制 function 的预解释机制 预解释机制 面试题练习 预解释的的不同机制 预解释也叫预声明,是提前解释声明的意思:预解释是针对变量和函数来说的:但 ...

  2. VScode快捷键集锦(持续更新)

    本文的快捷键是根据VScode for mac来的,Windows和Linux用户可能需要些许改动. 注释:cmd + /  注释当前选中的行,或者注释掉选中的行,再按一次反注释.还可以在按cmd + ...

  3. VS Code WebApi系列——3、发布

    上两篇已经实现了WebApi及基于jwt的Token设置,那么功能做完了,该发布WebApi了.为什么要对发布进行一下说明呢,因为是基于vscode和.netcore的发布,所以可能会遇到莫名奇妙的问 ...

  4. Java 源码刨析 - 线程的状态有哪些?它是如何工作的?

    线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在. 一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源.更加轻量化,也因 ...

  5. cb42a_c++_STL_算法_替换_replace

    cb42a_c++_STL_算法_替换_replacereplace(b,e,ov,nv),ov,old value, nv,new valuereplace_if(b,e,p,v) 根据p的条件,全 ...

  6. 最通俗易懂的RSA加密解密指导

    前言 RSA加密算法是一种非对称加密算法,简单来说,就是加密时使用一个钥匙,解密时使用另一个钥匙. 因为加密的钥匙是公开的,所又称公钥,解密的钥匙是不公开的,所以称为私钥. 密钥 关于RSA加密有很多 ...

  7. Redis设置并查看最大连接数

    在 Redis2.4 中,最大连接数是被直接硬编码在代码里面的,而在2.6版本中这个值变成可配置的. maxclients 的默认值是 10000,你也可以在 redis.conf 中对这个值进行修改 ...

  8. vue环境配置脚手架搭建,生命周期,钩子

    Vue项目环境搭建 """ node ~~ python:node是用c++编写用来运行js代码的 npm(cnpm) ~~ pip:npm是一个终端应用商城,可以换国内 ...

  9. vue多个项目公共化组件方案

    前言 最近项目需求,需要把两个vue项目多个一样的模块抽成公共化.考虑采用的方案 1.把公共部分独立出来一个项目,npm发布私有包,使用的项目npm install下载(目前下载使用出现配置错误) 存 ...

  10. 【转载】提高访问 github 的速度

    原文地址:https://www.cnblogs.com/liuchao888/p/11733996.html 工具地址:http://tool.chinaz.com/dns?type=1&h ...