其实过滤器就是一级一级的筛选匹配,通过后放行
用authc 表示访问资源需要验证登录
用roles表示访问资源需要角色匹配成功
用perms表示访问角色需要perms中的匹配到
方式一:一般的权限设计用authc+roles即可(也可精确到按钮),
方式二:还可authc+perms 此时就是用户的资源和perms中的资源匹配
方式一:
所有用户及对应的资源信息在初始化的时候就加载到每台机器的内存,验证通过的情况下,授权时用户自身的信息每次请求一次每次从新加载(url,角色 分开),用户请求url,
在服务器中找此用户访问此url对应的role[].此资源要求的角色role[]和当前用户的角色(subject中有(role,perm,principal(用户信息)))是否匹配
subject中的role用来走roles过滤器验证角色条件
subject中的permission用来走perm过滤器用来验证perm需要的条件
subject中的principal用来存储用户登录信息
当前用户的subject中的信息来源:组织用户的role,perm,这种实现只需要role角色
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
//得到 doGetAuthenticationInfo 方法中传入的凭证
FinancialSalesUser shiroUser = (FinancialSalesUser) principals.fromRealm(getName()).iterator().next();
List<String> roleList = new ArrayList<String>();
List<String> permissionList = new ArrayList<String>();
String userName = shiroUser.getUserName();
List<FinancialSalesUserRole> selectedRoleList = new ArrayList();
if(null!=shiroUser){
selectedRoleList = this.financialSalesUserFacade.selectUserRole(shiroUser.getId());
if (null != selectedRoleList && selectedRoleList.size() > 0) {
for(FinancialSalesUserRole r: selectedRoleList){
roleList.add(r.getRoleId()+"");
FinancialSalesUserRoleCondition financialSalesRoleCondition =new FinancialSalesUserRoleCondition();
financialSalesRoleCondition.setRoleId(r.getRoleId()+"");
List<Map> branchArr = financialSalesRoleFacade.getRoleFuncUrl(financialSalesRoleCondition);
if (null != branchArr&& branchArr.size() > 0) {
for (Iterator<Map> it = branchArr.iterator(); it.hasNext();) {//遍历角色菜单
Map resource = it.next();
if (!"".equals(resource)&&resource!=null) {
permissionList.add(resource.get("url")+"");
}
}
}
}
}
}
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//这个确定页面�?<shiro:hasRole>标签的name的�??
info.addRoles(roleList);
//这个就是页面�? <shiro:hasPermission> 标签的name的�??
info.addStringPermissions(permissionList);
return info;
}
role过滤器的验证过程:
单个用户的只需要角色信息即可(之前做的也有单个用户的url信息),所有用户的即需要资源,有需要 角色
public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
throws Exception
{
Subject subject = getSubject(request, response);
HttpServletRequest request1 =(HttpServletRequest) ((WebSubject) SecurityUtils.getSubject()).getServletRequest(); //ServletActionContext.getRequest();
Cookie[] cookies = request1.getCookies();
String username1=getCookieValue(cookies, "username");
//String uk="Subject"+username1;
//Subject currentUserrds=(Subject)webSession.getAttribute(uk);
String uk="request";
String rk="response";
//byte[] request2=(byte[])webSession.getAttribute(uk+username1);
//byte[] response1=(byte[])webSession.getAttribute(rk+username1);
//
//ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new java.io.ByteArrayInputStream(request2)));
//HttpServletRequest user = (HttpServletRequest) ois.readObject();
//if(request2!=null&&response1!=null){
////subject= getSubject(user, response1);
//}
String[] rolesArray = (String[])mappedValue;
if ((rolesArray == null) || (rolesArray.length == 0))
{
return true;
}
// Set<String> roles = CollectionUtils.asSet(rolesArray);
boolean flag=false;
String[] roles = (String[])rolesArray[0].split(",");
for(int i=0;i<roles.length;i++){
System.out.println(roles[i]);
if(subject.hasRole(roles[i])){
return subject.hasRole(roles[i]);
}
}
return flag;
}
方式 二:
全局所有用户的资源及对应要求的perm信息加载到内存中,组装好此用户的perm信息,当用户访问资源时,用户的perm信息和此访问资源对应要求的perm匹配,有的话通过
即授权的时候不通过角色,但是我们在设计组织数据的时候,还是要通过用户关联角色,角色关联资源,只是匹配的时候只去用户的perm和数据库中的perm即可
当前用户的subject中的信息来源:用户的perm信息组织:这种权限思路只需要perm
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
User user= (User) SecurityUtils.getSubject().getPrincipal();//User{id=1, username='admin', password='3ef7164d1f6167cb9f2658c07d3c2f0a', enable=1}
Map<String,Object> map = new HashMap<String,Object>();
map.put("userid",user.getId());
List<Resources> resourcesList = resourcesService.loadUserResources(map);
// 权限信息对象info,用来存放查出的用户的所有的角色(role)及权限(permission)
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
for(Resources resources: resourcesList){
info.addStringPermission(resources.getResurl());
}
return info;
}
perm的过滤器验证过程:
protected boolean isPermitted(Permission permission, AuthorizationInfo info) {
Collection<Permission> perms = getPermissions(info);
if (perms != null && !perms.isEmpty()) {
for (Permission perm : perms) {
if (perm.implies(permission)) {
return true;
}
}
}
return false;
}
相关推荐
8. **用户认证与授权**:使用如Spring Security或Apache Shiro等工具实现用户登录、权限控制,确保只有授权用户可以访问特定资源。 9. **缓存机制**:为了提高系统性能,可能会使用缓存技术,如Redis或Ehcache,来...
最后,压缩包中的“Users”可能包含有关用户管理的相关模块,如用户注册、登录、权限控制等,这部分是任何系统中不可或缺的部分,涉及到的身份验证和授权机制通常会使用Spring Security或Apache Shiro等库。...
9. **安全配置**:Spring Security或Apache Shiro等用于实现用户认证和授权,确保只有合法用户能访问特定资源。 10. **测试类**:单元测试和集成测试,确保各个组件的功能正确性。 总的来说,这个基于SpringBoot+...
这两种框架都提供了强大的访问控制功能,可以实现用户的登录验证、权限校验以及会话管理等。结合Spring Boot的特性,我们可以预见到源码中会有自定义的过滤器和授权逻辑,为不同角色的用户分配不同的操作权限。 ...
5. **Struts或Spring MVC**:这两种都是基于MVC模式的Web应用框架,用于组织和管理应用的控制层逻辑。它们可以帮助开发者更好地分离视图、控制和模型,提高代码的可读性和可维护性。 6. **流程引擎**:OA系统的核心...
6. **安全性**:项目可能使用Spring Security或Apache Shiro等框架进行用户认证和授权,防止SQL注入、XSS攻击等安全问题。 7. **测试**:由于是源码,可能会包含单元测试和集成测试,使用JUnit、Mockito等工具确保...
安全方面,Spring Security或Apache Shiro可能被用于用户认证和授权。此外,项目可能还涉及了缓存机制(如Redis)、消息队列(如RabbitMQ)和日志管理(如Log4j)等技术。 论文部分会详细阐述上述技术的使用情况,...
Spring 通过代理的方式实现AOP,主要有动态代理(JDK Proxy)和CGLIB两种方式。 ### Shiro 框架的使用 Shiro 是一个Java安全框架,用于身份验证、授权、加密和会话管理。它通过简单的API提供了强大的安全性支持。 ...
8. **安全机制**:Spring Security或Apache Shiro可能被用来实现用户认证和授权,保护系统资源不被非法访问。 9. **单元测试与集成测试**:JUnit或TestNG可能用于编写单元测试,确保代码功能的正确性;而Selenium或...