用户认证

网友投稿 572 2022-11-23

用户认证

用户认证

继上一篇登录拦截​​登录拦截​​

导入依赖

org.projectlombok lombok 1.16.10 log4j log4j 1.2.17 com.alibaba druid 1.1.21 mysql mysql-connector-java org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.0 org.apache.shiro shiro-spring 1.4.1 org.thymeleaf thymeleaf-spring5 org.thymeleaf.extras thymeleaf-extras-java8time org.springframework.boot spring-boot-starter-web

编写一个application.yml配置文件

spring: datasource: username: root password: 123456 # 假如市区报错了,就增加一个时区的配置就ok了 serverTimezone=UTC url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8 driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource #Spring Boot 默认是不注入这些属性值的,需要自己绑定 #druid 数据源专有配置 initialSize: 5 # 初始化大小 minIdle: 5 # 最小连接数 maxActive: 20 # 最大连接数 maxWait: 60000 # 取连接等待超时的时间 timeBetweenEvictionRunsMillis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最小生存的时间,单位是毫秒 validationQuery: SELECT 1 FROM DUAL # 验证连接有效与否的SQL,不同的数据配置不同 testWhileIdle: true # 这里建议配置为TRUE,防止取到的连接不可用 testOnBorrow: false testOnReturn: false poolPreparedStatements: true #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入 #如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority #则导入 log4j 依赖即可,Maven 地址: filters: stat,wall,log4j maxPoolPreparedStatementPerConnectionSize: 20 useGlobalDataSourceStat: true connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

在application.propertiea写mybatis配置

mybatis.type-aliases-package=com.rzk.pojo mybatis.mapper-locations=classpath:mapper/*.xml

pojo包下的user

@Data@AllArgsConstructor@NoArgsConstructorpublic class User { private int id; private String name; private String pwd; private String perms;}

mapper接口

User queryUserByName(String name);

resources下mapper包下mapper.xml

service

@Autowired public UserMapper userMapper; @Override public User queryUserByName(String name) { return userMapper.queryUserByName(name); }

测试

login.html

用户:

密码:

编写MyController

这一段是根据官方给的例子看

// 判断当前的用户是否被认证 if (!currentUser.isAuthenticated()) { //Token : 令牌 UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa"); token.setRememberMe(true);//设置记住我 try { currentUser.login(token);//执行登录操作 } catch (UnknownAccountException uae) { log.info("There is no user with username of " + token.getPrincipal()); } catch (IncorrectCredentialsException ice) { log.info("Password for account " + token.getPrincipal() + " was incorrect!"); } catch (LockedAccountException lae) { log.info("The account for username " + token.getPrincipal() + " is locked. " + "Please contact your administrator to unlock it."); } // ... catch more exceptions here (maybe custom ones specific to your application? catch (AuthenticationException ae) { //unexpected condition? error? } }

controller代码

@RequestMapping("/login") public String login(String username,String password,Model model){ //获取当前的用户 Subject subject = SecurityUtils.getSubject(); //封装用户登录数据 UsernamePasswordToken token = new UsernamePasswordToken(username,password); try{ subject.login(token);//执行登录方法,如果都没有异常就显示说明ok return "index"; }catch (UnknownAccountException e){//用户名不存在 model.addAttribute("msg","用户名错误"); return "login"; }catch(IncorrectCredentialsException ice) {//密码不存在 model.addAttribute("msg","密码错误"); return "login"; } }

认证

用户登录会走 自定义的UserRealm的doGetAuthenticationInfo请求

在认证方法里面获取用户名密码

//认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { System.out.println("执行了=>认证doGetAuthenticationInfo"); UsernamePasswordToken userToken = (UsernamePasswordToken) token; //用户名 密码 User user = userService.queryUserByName(userToken.getUsername()); if (user==null){//沒有查到此人 return null;//会抛出异常 UnknownAccount } Subject sub = SecurityUtils.getSubject(); Session session = sub.getSession(); session.setAttribute("loginUser",user); //密码认证shiro做 //把第一个参数的user传到 授权的subject里面,subject就能拿到用户对象 return new SimpleAuthenticationInfo(user,user.getPwd(),""); }

测试

以 李四 123456 账号登录

密码错误进行登录

密码正确进行登录

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:linux通过screen工具来后台传输文件
下一篇:Shiro登录拦截
相关文章

 发表评论

暂时没有评论,来抢沙发吧~