创建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加密。