一.从数据库获取shiro所需要信息
1.血与泪的教训
注意:将spring-mvc.xml提前加载 否则shirofilter加载时 spring容器中bean并没有加载 所以导致bean注入失败问题
<!--配置spring容器的配置文件的位置--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring.xml,classpath:spring/spring-mvc.xml</param-value> </context-param>
2.在自定义realm中,注入dao或service(数据库认证和授权的流程)
用来执行认证或者授权
(1) 认证流程
(思路 :通过token获得principal 获得username 用username去数据库获得 user对象 将对象信息
给authentication(username,password),authentication注入盐 认证器会拿着你给他的信息 去和前台传入信息 进行比对,进行校验是否认证成功。)
/** * 认证 * @param authenticationToken 主体传过来的认证信息 * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { // 1. 从主体传过来的认证信息中获取用户名 String userName = (String) authenticationToken.getPrincipal(); // 2. 通过用户名到数据库中获取凭证 String password = getPasswordByUserName(userName); if (password == null) { return null; } SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(userName, password, "customRealm"); // 加盐 authenticationInfo.setCredentialsSalt(ByteSource.Util.bytes("a")); return authenticationInfo; } /** * 去数据库查询凭证 * @param userName * @return password */ private String getPasswordByUserName(String userName) { User user = UserDaoImpl.getUserByUserName(userName); return user.getPassword(); }
(2) 授权流程
(获得用户名 ,根据用户名 获得用户和权限的集合 给info对象 返回之后 即可判断用户输入的信息和所返回的信息的一致 性:代码如下)
/** * 授权 * @param principalCollection * @return */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { String userName = (String) principalCollection.getPrimaryPrincipal(); // 从数据库或者缓存中获取角色数据 Set<String> roles = getRolesByUserName(userName); // 从数据库或者缓存中获取权限数据 Set<String> permission = getPermissionByUserName(userName); //摄入daoinfo中 和用户数据比较 SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo(); simpleAuthorizationInfo.setRoles(roles); simpleAuthorizationInfo.setStringPermissions(permission); return simpleAuthorizationInfo; } /** * 数据库或者缓存中获取角色数据 * @param userName * @return */ private Set<String> getRolesByUserName(String userName) { List<String> roleList = userDao.queryRolesByUserName(userName); Set<String> roleSets = new HashSet<String>(roleList); return roleSets; } /** * 数据库或者缓存中获取权限数据 * @param userName * @return */ private Set<String> getPermissionByUserName(String userName) { List<String> permissionList = userDao.queryPermissionByUserName(userName); Set<String> permissionsSets = new HashSet<String>(permissionList); return permissionsSets; }
Controller代码如下:
if(subject.hasRole("admin")) return "有admin权限"; else return "没有admin权限";
2.通过注解方式进行授权
(1)依赖
<!--shiro 配置注解授权使用--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.10</version> </dependency>
(2)mvc.xml中三个配置
<!--shiro 注解驱动的三个步骤--> <!--开启aop--> <aop:config proxy-target-class="true"/> <bean class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean>
测试
@RequiresRoles("admin") @RequestMapping("/testRole") @ResponseBody public String testRole() { return "test Success"; } @RequiresRoles("admin1") @RequestMapping("/testRole1") @ResponseBody public String testRole1() { return "test Success"; }
2018-6-7 14:06