Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| docs:3400_how_to:0800_security_and_protection [2022/08/25 06:59] – ↷ Page moved and renamed from docs:3400_how_to:0800_security_and_protection:0000_start to docs:3400_how_to:0800_security_and_protection administrator | docs:3400_how_to:0800_security_and_protection [2026/04/01 00:41] (current) – aware_support3 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Security And Protection ====== | ====== Security And Protection ====== | ||
| + | ==== How To ==== | ||
| {{simplenavi> | {{simplenavi> | ||
| + | |||
| + | < | ||
| + | <panel type=" | ||
| + | Most multi-user systems require that different categories of users have access to different features of the system. In // | ||
| + | </ | ||
| + | |||
| + | <panel type=" | ||
| + | In // | ||
| + | </ | ||
| + | |||
| + | <panel type=" | ||
| + | In // | ||
| + | </ | ||
| + | |||
| + | <panel type=" | ||
| + | Most operations are invoked from forms - see [[docs: | ||
| + | |||
| + | You can also define an “applicability condition” when defining an operation, for example: | ||
| + | |||
| + | <code aim> | ||
| + | |||
| + | The operation will only be shown for those members whose status is Active. | ||
| + | </ | ||
| + | |||
| + | <panel type=" | ||
| + | If you want to limit access to business objects or its attributes based on some conditions you have to specify business rules that use the '' | ||
| + | </ | ||
| + | |||
| + | <panel type=" | ||
| + | Sometimes it may be necessary for end users (for example, system administrators) to override access restrictions supplied by developers. This could be the case if developers sell their application to many different customers each of them having their own unique access level requirements. | ||
| + | |||
| + | This can be done as part of the “User Defined Processes/ | ||
| + | </ | ||
| + | |||
| + | <panel type=" | ||
| + | It is often required that the same application is hosted for different “tenants”. A tenant logs into the system and only sees data that belongs to him, but not other tenants. | ||
| + | |||
| + | There are two approaches in // | ||
| + | |||
| + | - Each tenant has a separate business space allocated to the tenant and the same application is loaded into each business space | ||
| + | - All tenants are managed by the same business space and the application itself is defined in such a way that each tenant’s data is protected from another tenant | ||
| + | There are pros and cons in both approaches, so the approach you should take depends on your specific requirements. | ||
| + | |||
| + | The advantage of the first approach is that each tenant is completely independent from each other because each business space is totally separate from another one. Moreover, you can allocate a separate database to each business space, so that the data of each tenant is stored in its own database. The application is simpler because there is nothing in it that refers to tenants. Data backup can be done on a tenant-by-tenant basis and a data problem in one tenant doesn’t affect another tenants. | ||
| + | |||
| + | The disadvantage of the first approach is that if there are thousands of tenants, existence of thousands of business spaces can significantly impact the performance of the server (however, you can add more servers to alleviate the problem). Another disadvantage is that if your applications needs functionality that works across different tenants – for example, if you want to collect statistics about your tenants, look at all registered tenants etc, it may be hard to do if all your tenants are independent applications. | ||
| + | |||
| + | Advantages and disadvantages of the second approach are reverse of that of the first one. The second approach may not depend as much on the larger number of tenants as the first approach and it’s also quite easy to provide functionality that looks across different tenants. But the application itself becomes more complicated and it is a lot more difficult to provide backup/ | ||
| + | |||
| + | The following paragraph describes what needs to be done in the application to implement the second approach. This is what you need to do: | ||
| + | |||
| + | - Define an object representing a Tenant | ||
| + | - For all objects that belong to the tenant add a reference to the Tenant that it belongs to, for example '' | ||
| + | - The user object must have a reference to Tenant that it operates on behalf of - '' | ||
| + | - For each object that belongs to some tenant add rules to initialise tenant from the tenant of the logged in user that created the object, for example:< | ||
| + | | ||
| + | - Finally add protection rules to the object that belong to the tenant so that other tenants do not see it, for example:< | ||
| + | READ PROTECT Account FROM ALL EXCEPT System </ | ||
| + | </ | ||
| + | |||
| + | <panel type=" | ||
| + | // | ||
| + | </ | ||
| + | |||
| + | </ | ||