2012-07-04 51 views

回答

1

也许是这样的:

Pesudocode: 

generate hashed link that is unique to user (e.g. md5(email+timestamp+salt)) 
store hash for user in db 
Send link to user in email (same email as used in hash) 

when user accesses site using link: 

fetch hash part from link 
match hash against database 
if match is found, authenticate, else fail 

注意,我不能保证,这是通过任何方式做(不知道如果它甚至有可能是一个安全的方式只有通过链接进行身份验证时才是安全的)。只是一些想法让你走。

2

您可能想要查看FOSUserBundle,它内置了很多用于管理用户的内容。

我们使用类似的技术来注册用户。下面是一些基本的代码(你需要用错误处理和实际发现基于URL参数的用户的方法填写:

/** 
* @Route("/register/activate/{hash}/{oId}", requirements={"hash"="\w+", "oId"="\d+"}, name="register_byhash") 
* @Method({"GET"}) 
* @Template() 
*/ 
public function registerByHashAction($hash, $oId) 
{ 
    $um = $this->container->get('fos_user.user_manager'); 
    $user = $um->findUserByHash($hash, $oId); // You will need to supply a method that finds the user and checks the hash 

    // Mark the user as now active and save the user here 

    $providerKey = $this->container->getParameter('fos_user.firewall_name'); 
    $token = new UsernamePasswordToken($user, null, $providerKey, $user->getRoles()); 
    $this->container->get('security.context')->setToken($token); 


    $url = $this->container->get('router')->generate('welcome'); 
    return new RedirectResponse($url); 
} 
0

解决这个最好的办法是实现一个自定义身份验证提供者的身份验证供应商负责用户身份验证,使用您希望几乎一切:可能是一个cookie(记得我为例),表单数据,或者在你的情况,查询字符串参数

你需要:

  • 用于存储认证参数的自定义令牌可以管理令牌和验证用户
  • 一些这些组件装配到安全系统之三
  • 自定义的认证供应商(意味着你需要定义一个工厂,某些配置)。

使用身份验证提供程序,您将有机会将记录的用户分配给自定义安全角色(因为记住我的功能),因此您可以将登录用户与“自动登录”用户区分开来。如果要限制自动登录的用户可以执行的操作(例如,您可能希望仅对某个特定操作进行身份验证),这可能非常有用。

有大约自定义身份验证提供正式菜谱食谱:

http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html

我已经做了相当多,你需要什么,在screenfony.com博客中写道一下:

http://www.screenfony.com/blog/symfony-custom-authentication-provider

相关问题