Android : Symfony2 + FosUserBudle + Android login

on Monday, March 23, 2015


I'm new in Symfony2 and android and I am trying to create an application in android to connect to my app in Symfony2, I am using FOSUserBundle but I can not work, the problem is with the request for android because when I try via url works perfectly


browser via http: //IP/testapi/web/app_dev.php/api/v1/login.json username = admin & password = adminpassword?


and then a http: //IP/testapi/web/app_dev.php/api/admin/v1/blog/4.json


Works perfect !!


With android:


The login "works" but when I ask for blog route doesn't work, but if I delete the line "- {Path: ^ / api / admin / v1 /, role: ROLE_ADMIN}", works perfect on both sides (Android and browser)


Symfony2 code



Security.yml




firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
use_forward: false
use_referer: true
login_path: /
check_path: /login_check
always_use_default_target_path: false
default_target_path: /
logout: true
anonymous: true
api_main:
pattern: ^/api/admin/v1/
anonymous: false
form_login: false
stateless: true
provider: fos_userbundle
http_basic:
realm: "REST Service Realm"

access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, role: ROLE_ADMIN }
- { path: ^/api/admin/v1/, role: ROLE_ADMIN }



Login Api




public function getLoginAction(Request $request, ParamFetcherInterface $paramFetcher)
{
$username = $paramFetcher->get('username');
$password = $paramFetcher->get('password');
$user_manager = $this->get('fos_user.user_manager');
$factory = $this->get('security.encoder_factory');

$user = $user_manager->loadUserByUsername($username);

if ($user){
$encoder = $factory->getEncoder($user);

$valid = ($encoder->isPasswordValid($user->getPassword(),$password,$user->getSalt())) ? true : false;
if ($valid){
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->container->get('security.context')->setToken($token);

}

return array('id' => $user->getId(), 'username' => $user->getUserName(), 'logged' => $valid);
}else{
return array('username' => '', 'id' => 0, 'logged' => false);
}
}



Android Code (It's wrong but it is only for testing)




public class MainActivity extends ActionBarActivity {

@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//developer mode, don't publish this code in release mode.
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());

ObjectMapper mapper = new ObjectMapper();
try {
URL url = new URL("http://IP/testapi/web/app_dev.php/api/v1/login.json?username=admin&password=adminpassword");
User user = mapper.readValue(url, User.class);
Log.d("TESTAPI",user.getUsername());
URL url_blog = new URL("http://IP/testapi/web/app_dev.php/api/admin/v1/blog/4.json");
Blog blog = mapper.readValue(url_blog, Blog.class);
Log.d("TESTAPI",blog.getCliente());
}catch (JsonParseException e) {
Log.e("TESTAPI",Log.getStackTraceString(e));
} catch (JsonMappingException e) {
Log.e("TESTAPI",Log.getStackTraceString(e));
} catch (IOException e) {
Log.e("TESTAPI",Log.getStackTraceString(e));
}

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}

0 comments:

Post a Comment