Spring Boot (十四): Spring Boot 整合 Shiro-登录认证和权限管理 (3)

根据以上的代码会自动生成 user_info(用户信息表)、sys_role(角色表)、sys_permission(权限表)、sys_user_role(用户角色表)、sys_role_permission(角色权限表)这五张表,为了方便测试我们给这五张表插入一些初始化数据:

INSERT INTO `user_info` (`uid`,`username`,`name`,`password`,`salt`,`state`) VALUES (\'1\', \'admin\', \'管理员\', \'d3c59d25033dbf980d29554025c23a75\', \'8d78869f470951332959580424d4bf4f\', 0); INSERT INTO `sys_permission` (`id`,`available`,`name`,`parent_id`,`parent_ids`,`permission`,`resource_type`,`url`) VALUES (1,0,\'用户管理\',0,\'0/\',\'userInfo:view\',\'menu\',\'userInfo/userList\'); INSERT INTO `sys_permission` (`id`,`available`,`name`,`parent_id`,`parent_ids`,`permission`,`resource_type`,`url`) VALUES (2,0,\'用户添加\',1,\'0/1\',\'userInfo:add\',\'button\',\'userInfo/userAdd\'); INSERT INTO `sys_permission` (`id`,`available`,`name`,`parent_id`,`parent_ids`,`permission`,`resource_type`,`url`) VALUES (3,0,\'用户删除\',1,\'0/1\',\'userInfo:del\',\'button\',\'userInfo/userDel\'); INSERT INTO `sys_role` (`id`,`available`,`description`,`role`) VALUES (1,0,\'管理员\',\'admin\'); INSERT INTO `sys_role` (`id`,`available`,`description`,`role`) VALUES (2,0,\'VIP会员\',\'vip\'); INSERT INTO `sys_role` (`id`,`available`,`description`,`role`) VALUES (3,1,\'test\',\'test\'); INSERT INTO `sys_role_permission` VALUES (\'1\', \'1\'); INSERT INTO `sys_role_permission` (`permission_id`,`role_id`) VALUES (1,1); INSERT INTO `sys_role_permission` (`permission_id`,`role_id`) VALUES (2,1); INSERT INTO `sys_role_permission` (`permission_id`,`role_id`) VALUES (3,2); INSERT INTO `sys_user_role` (`role_id`,`uid`) VALUES (1,1); Shiro 配置

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

ShiroConfig

@Configuration public class ShiroConfig { @Bean public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { System.out.println("ShiroConfiguration.shirFilter()"); ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); //拦截器. Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>(); // 配置不会被拦截的链接 顺序判断 filterChainDefinitionMap.put("/static/**", "anon"); //配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了 filterChainDefinitionMap.put("/logout", "logout"); //<!-- 过滤链定义,从上向下顺序执行,一般将/**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了; //<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问--> filterChainDefinitionMap.put("/**", "authc"); // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面 shiroFilterFactoryBean.setLoginUrl("/login"); // 登录成功后要跳转的链接 shiroFilterFactoryBean.setSuccessUrl("/index"); //未授权界面; shiroFilterFactoryBean.setUnauthorizedUrl("/403"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; } @Bean public MyShiroRealm myShiroRealm(){ MyShiroRealm myShiroRealm = new MyShiroRealm(); return myShiroRealm; } @Bean public SecurityManager securityManager(){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(myShiroRealm()); return securityManager; } }

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:配置记住我或认证通过可以访问

登录认证实现

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

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