基本的入门级别shiro需要两个配置文件:
@Configuration
public class ShiorConfig {
/**
* 创建SHiorFilterFactoryBean
*/
@Bean(name = "shiroFilter")
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager) {
// for (int i=0;i<90;i++)
// System.out.println("进来了 ");
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//设置安全管理器
shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
//添加shiro内置过滤器
/**
* 常用过滤器,可以实现权限相关的拦截器
* anon: 无需认证(登录) 可以访问
* authc: 必须认证才可以访问
* user: 如果使用remmberme的功能可以直接访问
* perms: 该资源必须得到资源权限才可以访问
* role: 该资源必须得到角色权限才可以访问
*/
/**
* 1、下述代码中必须是LinkedHashMap 而不能是HashMap。
*
* 2、anon定义必须在authc之前
*
* 否则anon定义不生效
*/
//设置拦截的请求
//必须为LinkedHashMap 否则anon不生效
Map<String,String> filterMap = new LinkedHashMap<>();
// shiroFilterFactoryBean.setLoginUrl("login1"); //设置跳转到登录页面的请求路径
filterMap.put("/loginHandle","anon");
filterMap.put("/tologin","anon");
filterMap.put("/testanon1","anon");
// filterMap.put("/testanon2","anon");
filterMap.put("static/**","anon");
filterMap.put("templates/**","anon");
filterMap.put("/testanon2","authc");
filterMap.put("/useradd","authc");
filterMap.put("/userupdata","authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
shiroFilterFactoryBean.setLoginUrl("tologin");
return shiroFilterFactoryBean;
}
/**
* 创建DefaultWebSecurityManager
*/
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
//关联realm
defaultWebSecurityManager.setRealm(userRealm);
return defaultWebSecurityManager;
}
/**
* 创建realm
*/
@Bean(name = "userRealm") //bean 的意思是把这个方法放在容器中以便于上面的方法使用
public UserRealm getRealm() {
return new UserRealm();
}
}
第二个配置类`public class UserRealm extends AuthorizingRealm {
/**
* 执行授权逻辑
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println(“执行授权逻辑”);
return null;
}
/**
* 执行认证逻辑
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("执行认证逻辑");
return null;
}
}
`
现在就可以写controller并且进行访问了,
以下代码是登录的后台 shiro验证是直接调用subject.login(token);
如果它抛出异常就是验证不通过 不抛异常就是验证通过
@RequestMapping("/loginHandle")
public String loginHandle(String name, String pass, Model model) {
/**
* 编写shiro认证操作
*/
// 1.获取subject
// 通常我们会将Subject对象理解为一个用户,同样的它也有可能是一个三方程序,它是一个抽象的概念,可以理解为任何与系统交互的“东西”都是Subject。
Subject subject = SecurityUtils.getSubject();
//2.封装用户数据
UsernamePasswordToken token = new UsernamePasswordToken(name, pass);
//3.执行登录方法
try {
subject.login(token); //只要一执行认证方法就会来到 认证操作的那个类 UserRealm
//只要这个方法没有任何异常 就代表登录成功
} catch (UnknownAccountException e) {
//登录失败 UnknownAccountException 代表用户名不存在
model.addAttribute("msg","用户名不存在");
System.out.println("登录失败");
return "Testanon";
}catch (IncorrectCredentialsException e1){
//密码错误 IncorrectCredentialsException
//登录失败
model.addAttribute("msg","密码错误");
return "Testanon";
}
return "Testanon";
}
shiro认证流程:https://www.cnblogs.com/lldsgj/p/10778867.html
需要的依赖
<!-- springboot 与shiro整合的依赖-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.3.2</version>
</dependency>
<!-- shiro 与 thymeleaf 整合标签的依赖-->
<dependency>
<groupId>com.github.theborakompanioni</groupId>
<artifactId>thymeleaf-extras-shiro</artifactId>
<version>2.0.0</version>
</dependency>