一、引入依赖
<!-- shiro依赖-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
二、数据源,配置文件
三、创建配置类
1.spring容器创建SecurityManager对象
@Bean
public DefaultWebSecurityManager securityManager(Realm realm){
//创建一个SecurityManager对象
DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
securityManager.setRealm(realm);//自定义realm对象
return securityManager;
}
2.自定义realm
@Bean
public Realm realm(CredentialsMatcher credentialsMatcher){
MyRealm myRealm=new MyRealm();
myRealm.setCredentialsMatcher(credentialsMatcher);//设置密码匹配器
return myRealm;
}
3.创建一个密码匹配器
@Bean
public CredentialsMatcher credentialsMatcher(){
HashedCredentialsMatcher credentialsMatcher=new HashedCredentialsMatcher();
credentialsMatcher.setHashAlgorithmName("MD5");//指定加密方式 MD5
credentialsMatcher.setHashIterations(5);//加密的次数 5
return credentialsMatcher;
4.shiro的过滤器工厂
@Bean("shiroFilter")
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
shiroFilterFactoryBean.setLoginUrl("/toLogin"); //
shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");
Map<String,String> map=new HashMap<>();
map.put("/login","anon");
map.put("/**","authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
return shiroFilterFactoryBean;
}
5.注入过滤器组件
@Bean
public FilterRegistrationBean<Filter> filter(){
FilterRegistrationBean registrationBean=new FilterRegistrationBean();
registrationBean.setName("shiroFilter");
registrationBean.addUrlPatterns("/*");
registrationBean.setFilter(new DelegatingFilterProxy());
return registrationBean;
}
四、创建controller层
@RestController
@CrossOrigin
public class LoginController {
@PostMapping("login")
public Vue login(String username, String password){
Subject subject= SecurityUtils.getSubject();
UsernamePasswordToken token=new UsernamePasswordToken(username,password);
try {
subject.login(token);
return new Vue(200,"登陆成功");
}catch (Exception e){
e.printStackTrace();
return new Vue(500,"登录失败");
}
}
@GetMapping("toLogin")
public String toLogin(){
return "请登录";
}
}
五、测试
在另一个软件测试得出结果
由于密码加密,所以数据库的密码也要加密
在controller层加入下列代码
public static void main(String[] args) {
Md5Hash md5Hash = new Md5Hash("ls", "xxx", 5);
System.out.println(md5Hash);
}