`
sw1982
  • 浏览: 511492 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Web项目中的登录验证思路

阅读更多

以前学习框架经常做登录页面的demo,输入正确的id+pwd就返回成功了。。可是这种模式无法阻止通过URL直接访问其他的页面,在一个非玩具系统中,控制未登录用户的页面访问权限是一个基本功能。

从实现思路讲,验证一个用户的有效登录,大多采用的是登入时候向Session写一个User认证信息,然后在访问每个页面前来判断Session中是否有认证信息。

if(session.get("User")==null

另外有很多网站提供记住登陆信息xx天,这种是结合了Cookie的认证信息存储。谈到这里,也可以仔细想想Cookie和Session的作用。比如卓越的购物车就是Cookie做的(因为关闭IE后再访问购物车还记得你的物品),而大多数群集Web服务器的信息也是采用Cookie(因为群集的Session同步开销很大),掌握了Cookie和Session的基本特性,这些都是理所当然的做法了。

一。下面说第一种拦截实现:基于javax.servlet.Filter

1.首先需要到web.xml注册一个filter

(这里是将authorityFilter这个类委托给spring来代理

<!-- authority filter proxy -->
<filter>   
        
<filter-name>authorityFilter</filter-name>   
        
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>   
        
<init-param>   
              
<param-name>targetFilterLifecycle</param-name>   
              
<param-value>true</param-value>   
        
</init-param>   
 
</filter>   
 
    <filter-mapping>
        
<filter-name>authorityFilter</filter-name>
        
<url-pattern>/*</url-pattern>
    
</filter-mapping>

2.写authorityFilter类(基于URL字符串的过滤实现) 

public class AuthorityFilter extends HttpServlet implements Filter ...{
    
private static final long serialVersionUID = 1L;
    
private static final Log log=LogFactory.getLog(AuthorityFilter.class);
    
public void init(FilterConfig arg0) throws ServletException ...{
        
//do something
    }

    
public void doFilter(ServletRequest sRequest, ServletResponse sResponse,    
            FilterChain filterChain) 
throws IOException, ServletException ...
        HttpServletRequest request 
= (HttpServletRequest) sRequest;    
        HttpServletResponse response 
= (HttpServletResponse) sResponse;    
        HttpSession session 
= request.getSession();    
        String url
=request.getServletPath();
        String contextPath
=request.getContextPath();
        
if(url.equals("/admin"))url+="/";
        
if(log.isDebugEnabled())
                log.debug(
"-----------------------"+url);
        
if((url.startsWith("/admin/")&&!url.startsWith("/admin/login")))...{//若访问后台资源
             Administartor adminUser=(Administartor)
                                     session.getAttribute(Constants.SESSION_ADMINISTRATOR);
             
if(adminUser==null)...{//转入管理员登陆页面
                  response.sendRedirect(contextPath+"/admin/login!input.action");
                  
return;
             }

        }

          filterChain.doFilter(sRequest, sResponse);  
    }

}

 

二。第二种权限过滤是基于struts2中Interceptor的概念

1.写过滤器类AuthorityInterceptor

public class AuthorityInterceptor extends AbstractInterceptor...{

    @Override
    
public String intercept(ActionInvocation invocation) throws Exception ...{
        
        ActionContext ctx 
= invocation.getInvocationContext();
        Map session 
= ctx.getSession();
        
//未登录,返回输入
        if(session.get("user")==null...{
            
return "input";
        }

        
//否则通过拦截
        return invocation.invoke();
    }


}

2.配置result结果

将自己写的拦截器和defaultStack组合成myStack,并且配置成默认拦截器!为了避免拦截登录页面,将登陆Action显式的配置<interceptor-ref name="defaultStack"/>,从而不使用默认的myStack拦截自己。

<struts>
    
<package name="webMail" extends="struts-default" namespace="/webMail">
    
<interceptors>
        
<interceptor name="authority" class="com.decentsoft.commons.security.AuthorityInterceptor"/>
        
<interceptor-stack name="myStack">
            
<interceptor-ref name="defaultStack"/>
            
<interceptor-ref name="authority"/>
        
</interceptor-stack>
    
</interceptors>
    
<default-interceptor-ref name="myStack"></default-interceptor-ref>
    
<global-results>
        
<result name="input" type="redirect">/WEB-INF/page/webMail/portal.jsp</result>
    
</global-results>

    
<action name="indexAction" class="com.mail.action.MailStatisticAction">
              
<result name="portal">/WEB-INF/page/webMail/portal.jsp</result>
              
<result name="login" type="chain">
                
<param name="actionName">webMailAction</param>
                
<param name="namespace">/webMail</param>
                
<param name="method">mailIndex</param>
              
</result>
              
<interceptor-ref name="defaultStack"/>
        
</action>
    
</package>
</struts>

3.MailStatisticAction的登录方法实现大概如下:根据校验结果返回登录或者进入页面

    /** *//**
     * 通行证
     * 
@return
     
*/

    
public String portal() ...{
        
        
//登录时候验证用户,并且将用户信息放到session!
        if(condition)) ...{
            MailUser user 
= new MailUser("x","x");
            session.put(
"user", user);
            
return "login";
        }

        
return "portal";
    }

三。第三种权限过滤是spring中的Acegi安全系统,这个功能很强大,有模型。在《spring in Action》有介绍,没有仔细研究过。


 

p.s Acegi 系统已经由spring独立作为一个子项目发布了,名字叫“security”。官方地址在:http://static.springframework.org/spring-security/site/index.html. 

这是一整套的安全解决方案,不仅仅只是登陆验证,还可以用来做复杂的权限模型


Spring Security

Formerly the Acegi Security System for Spring, Spring Security provides powerful and flexible security solutions for enterprise applications developed using the Spring Framework. It is a stable and mature product - Acegi Security 1.0.0 was released in May 2006 after more than two and a half years of use in large production software projects and adopted as an official Spring sub-project on its release.

Spring Security 2.0.0 builds on Acegi Security's solid foundations, adding many new features:

  • Simplified namespace-based configuration syntax. Old configurations could require hundreds of lines of XML but our new convention over configuration approach ensures that many deployments will now require less than 10 lines.
  • OpenID integration, which is the web's emerging single sign on standard (supported by Google, IBM, Sun, Yahoo and others)
  • Windows NTLM support, providing easy enterprise-wide single sign on against Windows corporate networks
  • Support for JSR 250 ("EJB 3") security annotations, delivering a standards-based model for authorization metadata
  • AspectJ pointcut expression language support, allowing developers to apply cross-cutting security logic across their Spring managed objects
  • Substantial improvements to the high-performance domain object instance security ("ACL") capabilities
  • Comprehensive support for RESTful web request authorization, which works well with Spring 2.5's @MVC model for building RESTful systems
  • Long-requested support for groups, hierarchical roles and a user management API, which all combine to reduce development time and significantly improve system administration
  • An improved, database-backed "remember me" implementation
  • Support for portlet authentication out-of-the-box
  • Support for additional languages
  • Numerous other general improvements, documentation and new samples
  • New support for web state and flow transition authorization through the Spring Web Flow 2.0 release
  • New support for visualizing secured methods, plus configuration auto-completion support in Spring IDE
  • Enhanced WSS (formerly WS-Security) support through the Spring Web Services 1.5 release
  • Updated support for CAS single sign-on (CAS 3 is now supported).
分享到:
评论

相关推荐

    基于springboot个人公务员考试管理系统源码数据库文档.zip

    基于springboot个人公务员考试管理系统源码数据库文档.zip

    bimdata_api_client-4.2.1-py3-none-any.whl

    bimdata_api_client-4.2.1-py3-none-any.whl

    numpy-1.20.2-cp39-cp39-linux_armv7l.whl

    numpy-1.20.2-cp39-cp39-linux_armv7l.whl

    matplotlib-3.3.2-cp39-cp39-linux_armv7l.whl

    matplotlib-3.3.2-cp39-cp39-linux_armv7l.whl

    bimdata_api_client-4.0.0-py3-none-any.whl

    bimdata_api_client-4.0.0-py3-none-any.whl

    ta_lib-0.5.1-cp312-cp312-win32.whl

    ta_lib-0.5.1-cp312-cp312-win32.whl

    基于springboot的非学勿扰学习交流平台源码数据库文档.zip

    基于springboot的非学勿扰学习交流平台源码数据库文档.zip

    基于springboot云平台的信息安全攻防实训平台源码数据库文档.zip

    基于springboot云平台的信息安全攻防实训平台源码数据库文档.zip

    pillow-10.4.0-cp311-cp311-linux_armv7l.whl

    pillow-10.4.0-cp311-cp311-linux_armv7l.whl

    springboot229基于Spring Boot的企业员工薪酬关系系统的设计.zip

    论文描述:该论文研究了某一特定领域的问题,并提出了新的解决方案。论文首先对问题进行了详细的分析和理解,并对已有的研究成果进行了综述。然后,论文提出了一种全新的解决方案,包括算法、模型或方法。在整个研究过程中,论文使用了合适的实验设计和数据集,并进行了充分的实验验证。最后,论文对解决方案的性能进行了全面的评估和分析,并提出了进一步的研究方向。 源码内容描述:该源码实现了论文中提出的新的解决方案。源码中包含了算法、模型或方法的具体实现代码,以及相关的数据预处理、实验设计和性能评估代码。源码中还包括了合适的注释和文档,以方便其他研究者理解和使用。源码的实现应该具有可读性、可维护性和高效性,并能够复现论文中的实验结果。此外,源码还应该尽可能具有通用性,以便在其他类似问题上进行进一步的应用和扩展。

    基于springboot+web的学生作业管理系统源码数据库文档.zip

    基于springboot+web的学生作业管理系统源码数据库文档.zip

    springboot244基于SpringBoot和VUE技术的智慧生活商城系统设计与实现.zip

    论文描述:该论文研究了某一特定领域的问题,并提出了新的解决方案。论文首先对问题进行了详细的分析和理解,并对已有的研究成果进行了综述。然后,论文提出了一种全新的解决方案,包括算法、模型或方法。在整个研究过程中,论文使用了合适的实验设计和数据集,并进行了充分的实验验证。最后,论文对解决方案的性能进行了全面的评估和分析,并提出了进一步的研究方向。 源码内容描述:该源码实现了论文中提出的新的解决方案。源码中包含了算法、模型或方法的具体实现代码,以及相关的数据预处理、实验设计和性能评估代码。源码中还包括了合适的注释和文档,以方便其他研究者理解和使用。源码的实现应该具有可读性、可维护性和高效性,并能够复现论文中的实验结果。此外,源码还应该尽可能具有通用性,以便在其他类似问题上进行进一步的应用和扩展。

    基于springboot网上书店源码数据库文档.zip

    基于springboot网上书店源码数据库文档.zip

    numpy-2.1.3-cp311-cp311-linux_armv7l.whl

    numpy-2.1.3-cp311-cp311-linux_armv7l.whl

    基于springboot的校园消费点评系统源码数据库文档.zip

    基于springboot的校园消费点评系统源码数据库文档.zip

    ta_lib-0.5.1-cp37-cp37m-win32.whl

    ta_lib-0.5.1-cp37-cp37m-win32.whl

    java高校学生信息管理系统源码数据库 MySQL源码类型 WebForm

    Java高校学生信息管理系统源码 一、源码介绍 高校学生信息管理系统设计主要应用JAVA语言编程和mysql数据库连接等相关知识,需要熟练掌握Struts2、Spring、Hibernate基础 二、主要功能 高校学生信息管理系统设计主要应用JAVA语言编程和mysql数据库连接等相关知识,需要熟练掌握Struts2、Spring、Hibernate基础,将所 学知识在生活中灵活运用,高校学生信息管理系统的主要设计功能如下: (1)学生信息管理模块:包括所有学生信息的查询(用分页列表显示)、查看某个学生的详细信息、删除某学生信息、修改某学生信息以及学生信息的录入等子功能 (2)学生成绩管理模块:包括成绩信息录入、学生成绩查询、查看某个学生的成绩表以及删除学生

    opencv_python-4.4.0.42-cp39-cp39-linux_armv7l.whl

    opencv_python-4.4.0.42-cp39-cp39-linux_armv7l.whl

    基于springboot扶贫助农系统源码数据库文档.zip

    基于springboot扶贫助农系统源码数据库文档.zip

    springboot235基于SpringBoot的房屋交易平台的设计与实现.zip

    论文描述:该论文研究了某一特定领域的问题,并提出了新的解决方案。论文首先对问题进行了详细的分析和理解,并对已有的研究成果进行了综述。然后,论文提出了一种全新的解决方案,包括算法、模型或方法。在整个研究过程中,论文使用了合适的实验设计和数据集,并进行了充分的实验验证。最后,论文对解决方案的性能进行了全面的评估和分析,并提出了进一步的研究方向。 源码内容描述:该源码实现了论文中提出的新的解决方案。源码中包含了算法、模型或方法的具体实现代码,以及相关的数据预处理、实验设计和性能评估代码。源码中还包括了合适的注释和文档,以方便其他研究者理解和使用。源码的实现应该具有可读性、可维护性和高效性,并能够复现论文中的实验结果。此外,源码还应该尽可能具有通用性,以便在其他类似问题上进行进一步的应用和扩展。

Global site tag (gtag.js) - Google Analytics