Shiro安全框架【快速入门】就这一篇! (7)

Apache Shiro 的核心通过 Filter 来实现,就好像 SpringMvc 通过 DispachServlet 来主控制一样。 既然是使用 Filter 一般也就能猜到,是通过URL规则来进行过滤和权限校验,所以我们需要定义一系列关于URL的规则和访问权限。

Filter Chain定义说明:

1、一个URL可以配置多个Filter,使用逗号分隔

2、当设置多个过滤器时,全部验证通过,才视为通过

3、部分过滤器可指定参数,如perms,roles

Shiro内置的FilterChain

Filter Name Class
anon   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!"; } } 第六步:准备页面

新建三个页面用来测试:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgddfz.html