很久没看到您发Castle的开发文章了,我一开始学Castle就是参考您写的文章,前两天使用MonoRail开发,遇到了很多的问题,只是苦于找不到与您联系的QQ或是MSN,自己硬是用穷举的方式来解决问题。现在好了终于有个完整的例子可以参考了,我的QQ:24615289,Msn:jickjick520@hotmail.com,有空的时候加我一下,我有些问题想向您请教!
@命运有自己的梦!
你可以给我发Email,msn和QQ不常用,我的email你在左边可以看到。我也很希望能和你交流以下。
thanks
model中没有用到LAZY,另外BLL层已经完成移植,改天放上来,现在在移植web层,挺烦的。。
在ibatis上有npetshop源码下载,使用castle,dal使用ibatis.net,可以去看看。
http://ibatis.apache.org/dotnetdownloads.html
:)
@newlee
thanks, 不过我看了不是用Castle的monorail的,看一下web.config就知道了啊。不知道你说的用castle其中一个组件吧?yes?
这年头喜欢匿名哪?这么多人匿名
对,不是用的monorail,而是castle.MVC。
个人感觉使用monorail需要使用vm,无法利用ms asp.net 2.0提供的很多功能,虽然可以和java web开发保证一致,不过...
:)
不过castle对castle.MVC的支持也很差,所以,前段时间,我不那个例子去掉了castle.MVC,直接使用asp.net 2.0+castle+ibatis.net,在vs2005上编译运行了一下。呵呵
@newlee
哦~我现在是用vm来的,在弄权限这块,似乎和asp.net不兼容,你对验证那里有什么看法么?有没有castle的做验证的例子?我现在的做法是靠自己判断cookie,似乎。。。。
或许,我的方法比较苯:
Controller
[Filter(ExecuteEnum.BeforeAction, typeof(SecurityFilter))]
Filter:
public bool Perform(ExecuteEnum exec, IRailsEngineContext context, Controller controller)
{
if ( !context.Session.Contains("User") )
return RedirectToLoginAndReturnFalse(context);
Account account;
try {
EISPrincipal user = (EISPrincipal)context.Session["User"];
if ( user == null || !(user.Identity.IsAuthenticated))
return RedirectToLoginAndReturnFalse(context);
account = Account.Find(int.Parse(user.Identity.Name));
} catch (Exception) {
return RedirectToLoginAndReturnFalse(context);
}
MonoRailAuthorizeService service2 = (MonoRailAuthorizeService)
((GlobalApplication)context.UnderlyingContext.ApplicationInstance).Container[typeof(MonoRailAuthorizeService)];
MonoRailURL requestedUrl = MonoRailURL.Find(context.UrlInfo.Area, context.UrlInfo.Controller, context.UrlInfo.Action);
bool permission = service2.IsPermit(account, requestedUrl);
if ( !permission )
RedirectToDenyAndReturnFalse(context);
return true;
}
private bool RedirectToLoginAndReturnFalse(IRailsEngineContext context)
{
context.Session["ReturnURL"] = context.Url;
context.Flash.Add("alarm", "You must login to access this page/action.");
context.Response.Redirect("account", "login");
return false;
}
private bool RedirectToDenyAndReturnFalse(IRailsEngineContext context)
{
context.Session["ReturnURL"] = context.Url;
context.Response.Redirect("account", "deny");
return false;
}
Account.Authenticate
[SkipFilter(typeof(SecurityFilter))]
public void Authenticate(int id, string password)
{
try {
Account account;
if ( service.IsValid(id, password) )
{
account = Account.Find(id);
account.IsAuthenticated = true;
Context.Session["User"] = new EISPrincipal(account);
string returnURL = (string)Session["ReturnURL"];
if ( returnURL != null && returnURL != "" )
{
Redirect(returnURL);
}else{
Redirect("Home", "Index");
}
// PropertyBag.Add("ReturnURL", returnURL);
}else{
Flash.Add("error", "Wrong worker id or password, try again!");
RedirectToAction("Login");
}
} catch (Exception ex) {
throw new Exception(string.Format("Unable to login user: {0} due to \"{1}\"", id, ex.Message));
}
}
AuthorizeService:
public class MonoRailAuthorizeService
{
public virtual bool IsPermit(Account account, MonoRailURL url)
{
MonoRailAuthorization[] authorizations = MonoRailAuthorization.FindAll(url);
if (authorizations == null || authorizations.Length == 0)
return false;
bool permit = false;
foreach (MonoRailAuthorization authorization in authorizations)
{
if (authorization.PrincipalType == MonoRailAuthorizePrincipalType.User)
{
if (authorization.PrincipalName == account.ID.ToString())
{
if (authorization.PermissionType == MonoRailAuthorizePermissionType.Allow)
permit = true;
else
return false;
}
}
else
{
if (account.IsInRole(authorization.PrincipalName))
{
if (authorization.PermissionType == MonoRailAuthorizePermissionType.Allow)
permit = true;
else
return false;
}
}
}
return permit;
}
}
}
MonoRailURL:
int ID{get,set}
string Area{get, set}
string Controller{get,set}
string Action{get, set}
MonoRailAuthorization:
MonoRailURL MonoRailURL{get, set}
MonoRailAuthorizePermissionType PermissionType{get, set}
MonoRailAuthorizePrincipalType PrincipalType{get, set}
@zzsu
thanks for ur code。
我现在也是用filter处理的,不过我更倾向于与asp.net兼容的方式处理。
to all:
关于petshop的移植web层到5月20号为止,已经完成用户部分和product的部分移植,由于时间忙不过来,所以请大家耐心等等了。
@all
5.31 PetShop 已经完全移植完毕,修正bug中,近期将放上来。同时祝大家儿童节快乐哇。不知道谁能提供一个演示空间呢。thanks.
cheer!