shiro整合MyBatis实现用户登录认证。

创建SpringBoot项目。

导入依赖:

<dependencies>

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring -->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.5.2</version>
    </dependency>


    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.22</version>
    </dependency>

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
        <scope>provided</scope>
    </dependency>

</dependencies>

配置application.yml

spring:
  datasource:
    username: root
    password: 154269564
    #时区报错----》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
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true

    #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
    #如果允许时报错  java.lang.ClassNotFoundException: org.apache.log4j.Priority
    #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

  thymeleaf:
    cache: false

#配置mybatis
mybatis:
  type-aliases-package: com.qi.pojo
  mapper-locations: classpath:mapper/*.xml

创建实体类User

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private int id;
    private String name;
    private String pwd;
}

创建Dao层

@Mapper
@Repository
public interface UserMapper {
    User queryUserByName(String name);
}

创建service层

@Service
@Resource
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public User queryUserByName(String name){
        return userMapper.queryUserByName(name);
    }
}

创建Mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.qi.Dao.UserMapper">

    <select id="queryUserByName" parameterType="String" resultType="User">
        select * from user where name = #{name}
    </select>

</mapper>

测试Mybatis:

@SpringBootTest
class Spring07ShiroApplicationTests {
    @Autowired
    UserService userService;
    @Test
    void contextLoads() {
        System.out.println(userService.queryUserByName("sdf"));
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qg4nNlnp-1588822311579)(SpringBoot.assets/image-20200507112651420.png)]

连接数据库成功。

部分前端页面:

<h1>
    登录页面
</h1>
<p th:text="${msg}" style="color: red"></p>
<form th:action="@{/login}" method="post">
    用户名:<input type="text" name="username"/>
    密码:<input type="text" name="pwd"/>
    <input type="submit" value="登录">
</form>

Controller层:

//获取用户名和密码
@RequestMapping("/login")
public String login(String username, String pwd, Model model){
    //获取当前用户
    Subject subject = SecurityUtils.getSubject();
    //封装用户登录信息
    UsernamePasswordToken token = new UsernamePasswordToken(username, pwd);
    try {
        subject.login(token);
        return "index";
    }catch (UnknownAccountException e){
        model.addAttribute("msg","用户名错误");
        return "login";
    }catch (IncorrectCredentialsException e){
        model.addAttribute("msg","密码错误");
        return "login";
    }
}

shrio的认证管理:

public class UserRealm extends AuthorizingRealm {

    @Autowired
    UserService userService;
    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行了授权--->doGetAuthorizationInfo");
        return null;
    }

    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken Token) throws AuthenticationException {
        System.out.println("执行了认证--->doGetAuthorizationInfo");
        
        UsernamePasswordToken token = (UsernamePasswordToken) Token;
        //连接真实数据库
        User user = userService.queryUserByName(token.getUsername());
        if(user==null){
            return null;//抛出异常:UnknownAccountException
        }
        //密码验证,交给shiiro做
        //加密: md5:3def184ad8f4755ff269862ea77393dd
        // md5盐值加密:3def184ad8f4755ff269862ea77393dd+username
        System.out.println(user);
        return new SimpleAuthenticationInfo("",user.getPwd(),"");
    }
}

之后可以对密码进行MD5加密。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章