- 浏览: 202523 次
- 性别:
- 来自: 北京
-
最新评论
-
粟谷_sugu:
干货!!!膜拜大神,持续学习
lucene中的docValue实现源码解读(三)——NumericDocValue的读取 -
suichangkele:
我的qq:1308567317
solr VS es -
wangq332:
老哥,我是solr的新司机,除了官方doc之外,其他的资料确实 ...
solr VS es -
一缕欢笑:
solrCloud中的路由策略:DocRouter、CompositeIdRouter、ImplicitDocRouter
文章列表
这个类和之前的AbstractShiroFilter是平级的,都是OnecPerRequestFilter的子类,我们从他的名字Advice中就能联想到他的用意——AOP,在spring中有很多的advice,也就是通知,比如前置通知,后置通知,最终通知等,这个类允许通过很多方法实现filter中的aop的特点,比如preHandle(前置通知),postHandle(后置通知,但是在抛异常的情况下可能不执行,),afterCompletion(最终通知,一定会执行)。
先看看他的doFilterInternal方法:
public void doFilterInternal(Se ...
这个类也是AdviceFilter的实现类,我们先看看他的preHandle方法
protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
if (this.appliedPaths == null || this.appliedPaths.isEmpty()) {
if (log.isTraceEnabled()) {
log.trace("appliedPaths ...
不知道你们怎么想的,反正我刚上来是没看出这个类有什么用,匿名的filter也就是不用添加拦截的路径的filter还用写吗,不把这个路径配置在shiroFilterFactoryBean中不就完了吗,而且他的onPreHandle里面直接返回的true,没有任何的判断操作,直到我看了他的javadoc才明白了作者的用意——实现更广范围中的过滤。
Javadoc中的意思是这样的:假设我们有这样的需求,所有的/user开头的路径都必须登录,那么我就可以这样配置 /user/**=authc,即对于用户的所有操作必须登录校验,但是对于用户的登录页面/user/login是个例外,这个时候就可以使用 ...
这个类很简单,用于在退出登录时将以前登录的用户注销掉,并且重定向到配置的页面,默认的是”/”,可以改变redirectUrl这个属性,使其跳转到我们指定的页面。
看看他的preHandle方法
@Override
protectedboolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
Subject subject = getSubject(request, response);
String redirectUrl ...
这个类的javadoc中说明了这个类才是限制应用中的资源能否被访问的filter,我们先看的onPreHandle方法:
publicboolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
return isAccessAllowed(request, response, mappedValue) || onAccessDenied(request, response, mappedValue);
}
可以发现 ...
这个类的javadoc的解释说:这个filter是的判断条件是当前用户必须登录或者是通过之前的登录时的remember me可以获得principalCollection,也就是必须知道用户是谁才可以。否则返回false,即不能通过这个filter。
源码如下:
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
if (isLoginRequest(request, response)) {
...
AuthenticationFilter是个抽象类,需要当前用户必须登录。我们看一下他的isAccessAllowed方法:
protectedboolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
Subject subject = getSubject(request, response);
returnsubject.isAuthenticated();//判断是否登录。
}
里面有个success ...
PassThruAuthenticationFilter这个类是一个最终的实现类,他实现了onAccessDenied方法,实现很简单
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
if (isLoginRequest(request, response)) {
return true;
} else {
saveRequestAndRedirectToLogin(request ...
这个抽象类也是继承自AccessControlFilter。他是用于处理登陆后的权限检查
他有一个属性unauthorizedUrl,表示如果没有对应的权限的话应该调到哪个页面。,这个可以不用配置,但是如果不配置的话默认为空,就会返回一个浏览器默认的401的页面。
看他的子类:
·HostFilter
·PermissionAuthorizationFilter
·PortFilter
·RolesAuthorizationFilter
第一个HostFilter和第三个ProtFilter在生产中不会用到,没有看。
这个是根据角色来判断某个操作能否进行,在配置ShiroFilterFactoryBean的时候每个filter后面的[role1,role2]被当做是角色来处理。
@SuppressWarnings({"unchecked"})
public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {
Subject subject = getSubject(request, resp ...
这个接口是用来实现rememberme的功能的。他的实现类为AbstractRememberMeManager,是一个抽象类,最终的继承类为cookieRememberMeManager,即将信息发送到cookie中。
先看一下defaultWebSecurityManager的构造方法:
public DefaultWebSecurityManager() {
super();
((DefaultSubjectDAO) this.subjectDAO).setSessionStorageEvaluator(new DefaultWebSessi ...
上一节说的是基于角色的权限验证,这一节介绍基于权限的角色验证类——PermissionAuthorizationFilter
这个类和前面的基于角色的判定一样,不过使用的权限而已,在配置shiroFilterFactoryBean的时候每一个filter后面的[permission1,permission2]表示的是权限,而且是或的关系,只要一个满足即可。
public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOExcepti ...
这个类不是一个工具类,但是我们在使用的时候就是将其作为一个工具类使用的,所以将其放在这里。我们看一下的javadoc就知道了.
Javadoc的翻译:这个类对所有的subject执行安全相关的操作,这个接口只是为了方便而存在的,他继承了Authenticator,authorizer,SessionManager,所以将所有的操作聚集在这个类中,通过引用其他的类来完成比如校验,授权,session管理的操做。对于大多数用户来说,这简化了配置,而且相对于指向Authenticator Authorizer SessionManager来说,更加的方便。
除此之外这个类还能进行有关用户产生 ...
这个类更简单,只是提供当前线程的subject和应用中唯一的securityUtils。源码如下:
public static Subject getSubject() {
Subject subject = ThreadContext.getSubject();
if (subject == null) {
subject = (new Subject.Builder()).buildSubject();
ThreadContext.bind(subject);
}
...
这个类提供的很多方法对于我们的平时开发都很有帮助,并不仅仅是shiro内部的应用。
<!--[if !supportLists]-->1、 1、 <!--[endif]-->getPathWithinApplication(HttpServletRequest),取得不包含应用路径的路径。
<!--[if !supportLists]-->2、 2、normalize(String path)将路径修改之后正常显示,去掉或者是替换比如”/”“/.”“/../”“\\”等。
<!--[if !supportLists]-->3、 3、& ...