2012-10-19 207 views
2

我写了一个小的grails webapp。我正在使用milton.io通过webdav访问一些内容。 因此,webdav仍然在工作,我可以放置,获取,删除文件 - 等等。 但现在我想添加身份验证和授权。这里的问题是:Milton.io身份验证

Resource接口给了我2种方法:

Object authenticate(String user, String password); 
boolean authorise(Request request, Request.Method method, Auth auth); 

所以我的资源类实现了资源的接口,但该方法身份验证时不会被框架调用。我是否必须自己实施Auth Basic?

我对米尔顿的认识很差。可能我忘记了一些东西,导致我的webdav客户端(例如尸体)从不要求输入用户名/密码。

感谢所有帮助 彼得Waver的

我的资源类的签名:

class SResource implements GetableResource, PropFindableResource, Resource, DeletableResource, MoveableResource, ReportableResource, CopyableResource 

class SFileResource extends SResource implements ReplaceableResource 

class SFolderResource extends SResource implements PutableResource, MakeCollectionableResource, CollectionResource 

这里是制造商,以获得HttpManager

class SMiltonConfig implements MiltonConfigurator { 


protected HttpManagerBuilder builder; 
protected List<Initable> initables; 
protected HttpManager httpManager; 

public SMiltonConfig(){ 
    try { 
     // Attempt to use Enterprise edition build if available 
     Class builderClass = Class.forName("io.milton.ent.config.HttpManagerBuilderEnt"); 
     builder = (HttpManagerBuilder) builderClass.newInstance(); 
     println ("load Ent. HTTP Manager") 
    } catch (InstantiationException ex) { 
     builder = new HttpManagerBuilder(); 
     println ("load Std. HTTP Manager") 
    } catch (IllegalAccessException ex) { 
     println ("load Std. HTTP Manager") 
     builder = new HttpManagerBuilder(); 
    } catch (ClassNotFoundException ex) { 
     println ("load Std. HTTP Manager") 
     builder = new HttpManagerBuilder(); 
    } 
} 

@Override 
public HttpManager configure(Config arg0) throws ServletException { 
    ResourceFactory rf = new SResourceFactory(); 
    builder.setMainResourceFactory(rf); 
    checkAddInitable(initables, builder.getMainResourceFactory()); 
    httpManager = builder.buildHttpManager(); 
    for(Initable i : initables) { 
     i.init(config, httpManager); 
    } 
    return httpManager; 
} 

@Override 
public void shutdown() { 
    httpManager.shutdown() 
    for(Initable i : initables) { 
     i.destroy(httpManager); 
    }   
} 

private void checkAddInitable(List<Initable> initables, Object o) { 
    if(o instanceof Initable) { 
     initables.add((Initable)o); 
    } else if(o instanceof List) { 
     for(Object o2 : (List)o) { 
      checkAddInitable(initables, o2); 
     } 
    } 
} 
} 

而这里ResourceFactory

class SResourceFactory implements ResourceFactory { 

def fileSystemService 

public SResourceFactory(){ 
    println "loading resource Factory" 
    def ctx = ServletContextHolder.servletContext.getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT) 
    fileSystemService = ctx.fileSystemService 
} 

@Override 
public Resource getResource(String host, String strPath) 
throws NotAuthorizedException, BadRequestException { 
    SResource sfr 
    sfr = fileSystemService.getFolderByPath(strPath) 
    return sfr 
} 
} 

回答

1

如果您需要基本身份验证 - 您必须启用它。因此,将以下行添加到SMiltonConfig类的配置方法中。

builder.setEnableOptionsAuth(true); // enables auth 
builder.setEnableBasicAuth(true); // optional 

这里的资源的一个例子授权法

@Override 
    public boolean authorise(Request r, Method m, Auth a) { 
     return a != null; 
    } 

希望它可以帮助

弗洛里安Pfann