- [TYNAMO-124] - Context path duplicated when redirecting to saved request
- [TYNAMO-133] - ShiroHttpServletRequest isn't used if there's no chain associated with the request
- [TYNAMO-121] - Ability to plug into ExceptionPage for the same exception type
- [TYNAMO-127] - Make SubjectFactory and RememberMeManager their own services for better flexiblity
- [TYNAMO-128] - Make Authenticator its own service to allow registering authenticationlisteners
Check out the tapestry-security guide for more information and enjoy!
Oh and btw, we had also previously released but hadn't announced a bug-fix release 0.1.2 for the exceptionpage module, that tapestry-security uses for exception handling. The lone issue was:
- [TYNAMO-126] - Exceptionpage doesn't work for page contributions
Read more about the exceptionpage module from tapestry-exceptionpage guide
Hey XXX, somehow our conversation from the other day got stuck in my head. First, I have to say that it looks to me you are putting too much emphasis on technologies. You should let your engineers and the business needs guide your technological choices, not the other way around. It's going to be expensive to rewrite your application later if you need to, but so what, it's going to be much more expensive to change the business if your current one doesn't work, and yet you are still doing it. Unless you want to make it your core competency to implement the solutions using the chosen technologies, you have to trust and rely on your engineers to make the right choices for the given problems. What you primarily need from your engineers is motivation and experience with one of the reasonably good technological choices and leave it at that. It's difficult to predict the future so whether you pick RoR, Django, Play or some other hot technology today, you don't know if it'll be a success anymore a few years down the road.
On the popularity of Tapestry, you asked "so how come nobody uses it?" By many measures, Java is the most popular language in the world but very few think of it as cool or hype it. The hyped Java is today pronounced "Android" or "Scala". Tapestry is a good example of what's left after the hype has deflated. Ruby on Rails is a fairly successful and popular framework, yet it was much, much more popular six years ago than it is today. In the world of Java, Tapestry, Play or Lift are still newcomers compared to such behemoths as Struts (one of the original web frameworks in Java). Java is just popular and old enough that the space is fragmented. The good news is that beyond "just" the web layer, you have libraries implemented in Java for almost any imaginable purpose you can simply take into use. Tapestry, or Java are not always good choices for web applications, because the needs for most of the websites are simple, so a simpler language and a simpler framework will not only suffice, but work better because more people are more productive with it and there may be less room for grave mistakes. For lots of applications you simply don't need all of the power Java or the JVM has to offer, but when you do, you really need it. The classic example for this is a highly threaded back-end application - if you have a need for it, a typical RoR or Python-based architecture implements the web layer in the given language, but the back-end architecture with a different language. Few other languages and platforms besides Java are comprehensive enough to implement everything from web to the database with the the same language (although certain Microsoft language comes to mind as an alternative). With RoR, Python or PHP, you pair it with MongoDB (implemented in C++) or perhaps MySQL (in C++ as well). A Java web framework, you pair with Cassandra, Hadoop, hsqldb or any of the other strong alternatives based on need, all implemented in Java. It makes it all more complex, which is also reflected in the pay grade between a typical Java developer and a php developer, or any of the other languages in between. What makes this even more interesting to you, is that as a business owner you have to consider the costs so the best solution for you might be finding the most inexpensive developers that are highly productive with their language of choice.
*** UPDATE ***: A bit after my email, my friend sent me a link to this great blog post by the Tumblr guys, to which I just had to reply. Again, I've re-posted the unedited follow-up below. Keep in mind that I'm purposefully making some simplifications to make my point clear (after all, I'm talking to a business dude). Anybody who's battled with scalability issues knows that while theoretical numbers might justify more modest hardware, it's all about building for the worst-case scenario with plenty of reserve capacity.
Nicely proves my point, no? :) Anyway, it's a surprisingly honest read about their architecture, and shows how most of the time it's all organically grown. They are getting reasonable results with their infrastructure, but still, paying a heavy penalty for the suboptimally performing web layer - 500 web servers versus 200 database servers, where most of the latter are used for stand-by high availability. In a typical scenario, the bottleneck should almost always be the database layer, not the web layer. Sharding is a way to get scalability out of MySQL, but it's far, far away from the highest performing SQL databases. Now, imagine if you could serve the whole database layer with 20 servers instead of 200.
For an all Java implementation with an embedded database, it's not uncommon to require 90th percentile response time within 10ms with at least 1 million page views a day from a single server. Performance matters (http://docs.codehaus.org/pages/viewpage.action?pageId=190316696).
At long last, we've gotten off our collective lazy ass and worked harder than ever for free to bring you tapesty-federatedaccounts 0.1.0, with twitter as the new authentication provider. Some jokesters might question why it took so long since we are just using the super-great twitter4j library, which is almost as good as RestFB that we use for Facebook integration. We are first to admit that twitter4j takes all the pain away from Oauth 1.0a's obnoxious request signing business, so we decided to spend our time refactoring the code to support the Oauth 1.0a/Oauth 2.0 call flows with the same base classes, as well as modularizing the whole implementation because one size just doesn't fit all. Now of course, you my dear don't even have to know any of the these details but just check out tynamo-federatedaccounts guide and open the gates for all of the Facebook and Twitter users to flock to your website
- [TYNAMO-92] - Twitter realm for federatedaccounts
[TYNAMO-120] - FallbackURL is no longer honored
You should upgrade.
Tapestry-security, the comprehensive security package for Tapestry just got a bit more comprehensive with the new 0.4.1 release! 0.4.x is tested with and meant both for T5.2 and T5.3.
We picked up the brand new Apache Shiro 1.2.0 release of which development snapshots we've been running against for months now. We also decided it's time to start eating our own dog food, so we delegated tapestry-security's exception handling to another module from tynamo.org, tapestry-exceptionpage, in order to gracefully handle security responses as redirects, ajax or not. Read more about what tapestry-security can do for you from tapestry-security guide. Special thanks to Lenny Primak for relentlessly bugging us until we just had to get the 0.4.1 out the door
- [TYNAMO-102] - Specify id for RequestExceptionHandler advice for preventing unintentional override
- [TYNAMO-103] - @Security, tapestry.secure-enabled, MetaDataConstants.SECURE_PAGE not honored by Tapestry security
- [TYNAMO-105] - Warning is issued in the log file on every startup
- [TYNAMO-87] - Redirects should honor localization
- [TYNAMO-106] - Login screen background file (login-bg.png) is too large for the web - smaller file attached
- [TYNAMO-109] - Allow Unauthorized and Login page to be a single page
- [TYNAMO-110] - redirect to login page for pages secured with @RequiresXXX annotations
- [TYNAMO-113] - Test for ajax in the AccessControlFilter.issueRedirect and issue a client-side "soft" redirect if so
- [TYNAMO-117] - Add symbol for disabling redirect to saved request
- [TYNAMO-118] - Store savedrequest into a cookie instead of session
- [TYNAMO-119] - In SecurityFilterChainFactoryImpl, use componentClassResolver to resolve pageclasses to urls
- [TYNAMO-111] - Add support for SslFilter & PortFilter
Winter is still in full swing, but the hibernation period for Tynamo is clearly over. I don't want to steal any of Alex' thunder from his JDO release, but on the heels of it we quickly shipped another release from our module warehouse. Tapestry-exceptionpage 0.1.1 is particularly useful, so handy in fact that we even started using it ourselves Tapestry-exceptionpage forms the foundation for handling exceptions in our upcoming tapestry-security 0.4.1 release. Read more from tapestry-exceptionpage guide.
- [TYNAMO-97] - tynamo-exceptionpage doesn't handle operationexceptions
This module has been a long time in the making - the initial commit of the basic functionality was added about 6 months ago when I had just finished working on a JDO based app running on Google App Engine. The module was inspired by the tapestry-jpa module at Tynamo.
JDO as a standard is a curious beast. It was the first attempt at building solid ORM functionality for the Java platform, there were a bunch of solid implementations out there (Apache JDO, Kodo, etc); however, it somehow never managed to catch fire like Hibernate. For a while, at least for me, it felt like the standard was on its way out, giving way to JPA; yet, it keeps coming back: Google App Engine JDO support, MongoDB JDO API through DataNucleus, etc.
In a nutshell, tapestry-routing allows you to provide your own custom mapping between Tapestry pages and URLs.
Did you ever wanted to change the order of the path params in an URL? now you can!
Let's say you have a page: pages.projects.Members which have 2 parameters in its activation context: (Long projectId, Long memberId) and you want the URL for that page to look like /projects/1/members/1 Just add the @At annotation to you page, like this:
tapestry-routing Dispatcher will take care of recognizing incoming requests and dispatching the proper render request
tapestry-routing PageRenderLinkTransformer will do the rest of the work, it will transform every Link for a page render request formatting it according to your route rule.
We really need some feedback, so please give it a try:http://tynamo.org/tapestry-routing+guide
TYNAMO-74 - Support inline Facebook oauth permission screen
Here's what Alejandro (the co-founder of Tynamo) had to say about the module:
I don't know if we should release this module, It's so easy to use that's not fair for people that suffered the Facebook nightmare. I want people to suffer as I DID!!! Damn it Kalle!! Excellent work!
Also check out the live example of federatedaccounts. Enjoy!
Notice how above I first blamed the browsers for not solving the problem, but then ended up sharing the blame with OAuth. That's because a) the UI redressing problem is not specific to OAuth and b) UI redressing is a super-tricky problem to solve. Simply displaying the URL of an iframe (even if browser assisted) is not nearly enough because that too can be easily redressed (see more at http://www.webmonkey.com/2008/10/a_look_at_the__clickjacking__web_attack_and_why_you_should_worry/). Browser developers do are trying to do something about the problem but they just don't agree on exactly what is the right measure (see e.g http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2008-September/016286.html).
To improve usability without asking for user's credentials in the same Oauth authorization dialog, Facebook could potentially allow passing a one-time valid user authentication token with the Oauth request, but in some ways that would only shift the responsibility somewhere else. There's an open standard for that as well, called OpenID, and you can by all means use OpenID together with OAuth as demonstrated by Google . Unfortunately though, the window redressing attack is just as big of a problem for OpenID as it is for OAuth. Since OpenID was originally meant for authentication only (though the attribute extensions make it partly an authorization technique) you cannot shift the responsibility any further. I'm not advocating the use of hybrid OpenID+Oauth model either - it may just increase complexity without improving user experience. However, we may be throwing the baby out with the bath water by never allowing Oauth dialogs to be shown in iframes. Certainly the authorization server has to be able to authenticate the end user one way or another, but handling an Oauth callback in an iframe is perfectly secure if you never ask the user's password in the same dialog. Anyhow, with the current standards there's no way out without major security implications, so browsers and ultimately, newer standards need to provide a better, more secure solution.