spring security简单登录的认证
一.思路
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简单登录的认证的更多相关文章
- Spring Security 自定义登录认证(二)
一.前言 本篇文章将讲述Spring Security自定义登录认证校验用户名.密码,自定义密码加密方式,以及在前后端分离的情况下认证失败或成功处理返回json格式数据 温馨小提示:Spring Se ...
- 玩转spring boot——简单登录认证
前言 在一个web项目中,某些页面是可以匿名访问的,但有些页面则不能.spring mvc提供了HandlerInterceptor接口来应对,只需要重写preHandle方法便可以实现此功能.那么使 ...
- spring security 简单入门
spring security 简单入门示例 一.概述 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架 . 其中最主要的安全操作有两 ...
- Spring Security 解析(三) —— 个性化认证 以及 RememberMe 实现
Spring Security 解析(三) -- 个性化认证 以及 RememberMe 实现 在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把 ...
- Spring Security 之Http Basic认证
使用Spring Security进行http Basic认证非常简单,直接配置即可使用,如下: <security:http> <security:http-basic>&l ...
- 登陆模块,这个是很重要的模块,有shiro和spring security专门的权限认证框架
登陆模块,这个是很重要的模块,有shiro和spring security专门的权限认证框架
- 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_05-SpringSecurityOauth2研究-搭建认证服务器
3 Spring Security Oauth2研究 3.1 目标 本项目认证服务基于Spring Security Oauth2进行构建,并在其基础上作了一些扩展,采用JWT令牌机制,并自定 义了用 ...
- Spring Security 基础登录实例
1 新建Java Web项目 导入Jar: 2 修改web.xml <?xml version="1.0" encoding="UTF-8"?> & ...
- 【权限管理系统】Spring security(三)---认证过程(原理解析,demo)
在前面两节Spring security (一)架构框架-Component.Service.Filter分析和Spring Security(二)--WebSecurityConfigurer配 ...
随机推荐
- C#数据结构与算法系列(七):约瑟夫问题(Josephu)
1.介绍 Josephu问题为:设编号为1.2....n的n个人围坐在一圈,约定编号为k(1<=k<=n) 的人从1开始报数, 数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人 ...
- 10.实战交付一套dubbo微服务到k8s集群(3)之二进制安装Maven
maven官网:https://maven.apache.org/ maven二进制下载连接:https://archive.apache.org/dist/maven/maven-3/3.6.1/b ...
- 2.K8S的核心资源管理方法
目录 1.1陈述式资源管理方法 1.1.1.管理名称空间资源 1.1.2.管理Deployment资源 1.1.3.管理Service资源 1.1.4.kubectl用法总结 1.2.声明式资源管理方 ...
- Git 居然可以用来跟女神聊天?
Git 是用来做啥的?想必码农朋友都知道,Git 是版本控制软件,是软件开发过程中团队协作不可或缺的软件. 但是,作为版本控制软件的 Git ,能跟聊天工具扯上关系吗?这二者似乎毫无关系,但脑洞大开的 ...
- opencv c++访问某一区域
int main(){ cv::Mat m1(,, CV_8UC1); for(int i=;i<m1.rows;++i) for(int j=;j<m1.cols;++j) m1.at& ...
- Wireshark论证TCP3次握手的过程
wireshark过滤条件:ip.addr == 120.79.36.180 千万别写成 ip.dst == 120.79.36.180 ,这样子就看不到服务器给我们返回的包了 此时,在浏览器输入12 ...
- disruptor架构三 使用场景更加复杂的场景
先c1和c2并行消费生产者产生的数据,然后c3再消费该数据 我们来使用代码实现:我们可以使用Disruptor实例来实现,也可以不用产生Disruptor实例,直接调用RingBuffer的api来实 ...
- 【SpringMVC】
前言
- robot framework使用小结(三)
robot framework采用行为驱动 新建测试案例baidu04,添加Library:Selenium2Library 右键项目名robotProject-->New Resource-- ...
- slow SQL
一.介绍 慢查询日志可用于查找需要很长时间才能执行的查询,因此是优化的候选者.但是,检查长慢的查询日志可能是一项耗时的任务. 二.配置 # 查看: slow_query_log 慢SQL开关 slow ...