Dan if you're asking the question in the context of scripting then easy way is check the integer returned by oBusObj.SecurityAccess (this is exactly what the system does too):
Using Customer Maintenance as an example:
View --> 0 same as Inquiry screen w/o being on the Inquiry screen
Modify (implies View) --> 2
Create (implies Modify + View) --> 3
Create + Modify (implies View) --> 3
Remove (implies View) --> 4
Modify + Remove (implies View) --> 6
Create + Remove (implies Modify + View) --> 7
Create + Modify + Remove (implies View) --> 7
E.g. I had a Post-Read script for Customer Maint for a new record that auto-set a UDF value for a secondary Customer No. Well the script fired off in Customer Inquiry too because it shares same business obj. To prevent that check if oBusObj.SecurityAccess > 0 and <> 2,4,6 (or check if = 3 or 7).
From this point it becomes a confusing mess to explain the rest.
If you check any box (Create, Modify, Remove, View), it creates a Sy_RoleSecurity record. If a record exists, the value of the flags (CreateFlag, ModifyFlag, RemoveFlag, PrintFlag, UpdateFlag) are simply 0 or 1, effectively a boolean. These On/Off's are used to come up with one of the integers above.
But if you did not check any of the boxes Create, Modify, Remove, View, then a Sy_RoleSecurity record never gets created and you never get to the point of even being able to check SecurityAccess (""you are not authorized"" msg)
Now let's say you have 0 access for Customer Maint but do have Customer Inquiry checked. Why can you get in? Well that's a different Task ID altogether. In Sy_RoleSecurity there will exist a record containing your RoleKey and TaskKey = 040000002 (Customer Inquiry task from Sy_Task).