Apache Shiro 的核心通过 Filter 来实现,就好像 SpringMvc 通过 DispachServlet 来主控制一样。 既然是使用 Filter 一般也就能猜到,是通过URL规则来进行过滤和权限校验,所以我们需要定义一系列关于URL的规则和访问权限。
Filter Chain定义说明:
1、一个URL可以配置多个Filter,使用逗号分隔
2、当设置多个过滤器时,全部验证通过,才视为通过
3、部分过滤器可指定参数,如perms,roles
Shiro内置的FilterChain
Filter Name Classanon org.apache.shiro.web.filter.authc.AnonymousFilter
authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
perms org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
port org.apache.shiro.web.filter.authz.PortFilter
rest org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
roles org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
ssl org.apache.shiro.web.filter.authz.SslFilter
user org.apache.shiro.web.filter.authc.UserFilter
anon:所有url都都可以匿名访问
authc: 需要认证才能进行访问
user:配置记住我或认证通过可以访问
第四步:准备 DAO 层和 Service 层新建【dao】包,在下面创建【UserInfoDao】接口:
public interface UserInfoDao extends JpaRepository<UserInfo, Long> { /** 通过username查找用户信息*/ public UserInfo findByUsername(String username); }新建【service】包,创建【UserInfoService】接口:
public interface UserInfoService { /** 通过username查找用户信息;*/ public UserInfo findByUsername(String username); }并在该包下再新建一个【impl】包,新建【UserInfoServiceImpl】实现类:
@Service public class UserInfoServiceImpl implements UserInfoService { @Resource UserInfoDao userInfoDao; @Override public UserInfo findByUsername(String username) { return userInfoDao.findByUsername(username); } } 第五步:controller层新建【controller】包,然后在下面创建以下文件:
HomeController:
@Controller public class HomeController { @RequestMapping({"http://www.likecs.com/","/index"}) public String index(){ return"/index"; } @RequestMapping("/login") public String login(HttpServletRequest request, Map<String, Object> map) throws Exception{ System.out.println("HomeController.login()"); // 登录失败从request中获取shiro处理的异常信息。 // shiroLoginFailure:就是shiro异常类的全类名. String exception = (String) request.getAttribute("shiroLoginFailure"); System.out.println("exception=" + exception); String msg = ""; if (exception != null) { if (UnknownAccountException.class.getName().equals(exception)) { System.out.println("UnknownAccountException -- > 账号不存在:"); msg = "UnknownAccountException -- > 账号不存在:"; } else if (IncorrectCredentialsException.class.getName().equals(exception)) { System.out.println("IncorrectCredentialsException -- > 密码不正确:"); msg = "IncorrectCredentialsException -- > 密码不正确:"; } else if ("kaptchaValidateFailed".equals(exception)) { System.out.println("kaptchaValidateFailed -- > 验证码错误"); msg = "kaptchaValidateFailed -- > 验证码错误"; } else { msg = "else >> "+exception; System.out.println("else -- >" + exception); } } map.put("msg", msg); // 此方法不处理登录成功,由shiro进行处理 return "/login"; } @RequestMapping("/403") public String unauthorizedRole(){ System.out.println("------没有权限-------"); return "403"; } }这里边的地址对应我们在设置 Shiro 时设置的地址
UserInfoController:
@RestController public class UserInfoController { @Resource UserInfoService userInfoService; /** * 按username账户从数据库中取出用户信息 * * @param username 账户 * @return */ @GetMapping("/userList") @RequiresPermissions("userInfo:view") // 权限管理. public UserInfo findUserInfoByUsername(@RequestParam String username) { return userInfoService.findByUsername(username); } /** * 简单模拟从数据库添加用户信息成功 * * @return */ @PostMapping("/userAdd") @RequiresPermissions("userInfo:add") public String addUserInfo() { return "addUserInfo success!"; } /** * 简单模拟从数据库删除用户成功 * * @return */ @DeleteMapping("/userDelete") @RequiresPermissions("userInfo:delete") public String deleteUserInfo() { return "deleteUserInfo success!"; } } 第六步:准备页面新建三个页面用来测试: